{
  "cells": [
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "2532a251-c662-4b4a-8de0-454b9878c991",
      "metadata": {
        "id": "2532a251-c662-4b4a-8de0-454b9878c991"
      },
      "source": [
        "# Detecting Anomalies using Heterogeneous GNNs\n",
        "\n",
        "## Exploring the CIDDS-001 dataset"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "NlU_XkX_v1Mt",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NlU_XkX_v1Mt",
        "outputId": "ab9ead45-1d83-441a-a273-a057bf4f670c"
      },
      "outputs": [],
      "source": [
        "import torch\n",
        "!pip install -q torch-scatter~=2.1.0 torch-sparse~=0.6.16 torch-cluster~=1.6.0 torch-spline-conv~=1.2.1 torch-geometric==2.2.0 -f https://data.pyg.org/whl/torch-{torch.__version__}.html\n",
        "\n",
        "torch.manual_seed(0)\n",
        "torch.cuda.manual_seed(0)\n",
        "torch.cuda.manual_seed_all(0)\n",
        "torch.backends.cudnn.deterministic = True\n",
        "torch.backends.cudnn.benchmark = False"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "c4de2c1e",
      "metadata": {},
      "source": [
        "The following download can be extremely slow. It is safer to perform it outside of this notebook."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "-sUj4z__qzfP",
      "metadata": {
        "id": "-sUj4z__qzfP"
      },
      "outputs": [],
      "source": [
        "from io import BytesIO\n",
        "from urllib.request import urlopen\n",
        "from zipfile import ZipFile\n",
        "\n",
        "url = 'https://www.hs-coburg.de/wp-content/uploads/2024/11/CIDDS-001.zip'\n",
        "with urlopen(url) as zurl:\n",
        "    with ZipFile(BytesIO(zurl.read())) as zfile:\n",
        "        zfile.extractall('.')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "756ebf31",
      "metadata": {},
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "d:\\Programs\\Anaconda\\envs\\gnnbook\\lib\\site-packages\\tqdm\\auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
            "  from .autonotebook import tqdm as notebook_tqdm\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "pd.set_option('display.max_columns', 100)\n",
        "import itertools\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.preprocessing import PowerTransformer\n",
        "from sklearn.metrics import f1_score, classification_report, confusion_matrix\n",
        "\n",
        "from torch_geometric.loader import DataLoader\n",
        "from torch_geometric.data import HeteroData\n",
        "from torch.nn import functional as F\n",
        "from torch.optim import Adam\n",
        "from torch import nn\n",
        "import torch"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a199ffdd-d0c6-481e-bdff-49272bb621c2",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 242
        },
        "id": "a199ffdd-d0c6-481e-bdff-49272bb621c2",
        "outputId": "d4a034e0-fad7-408a-f96e-60f2bbdd8c0f",
        "tags": []
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "d:\\Programs\\Anaconda\\envs\\gnnbook\\lib\\site-packages\\IPython\\core\\interactiveshell.py:3442: DtypeWarning: Columns (8) have mixed types.Specify dtype option on import or set low_memory=False.\n",
            "  exec(code_obj, self.user_global_ns, self.user_ns)\n"
          ]
        },
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Date first seen</th>\n",
              "      <th>Duration</th>\n",
              "      <th>Proto</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Src Pt</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Dst Pt</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>Flows</th>\n",
              "      <th>Flags</th>\n",
              "      <th>Tos</th>\n",
              "      <th>class</th>\n",
              "      <th>attackType</th>\n",
              "      <th>attackID</th>\n",
              "      <th>attackDescription</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2017-03-15 00:01:16.632</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>58844.0</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2017-03-15 00:01:16.552</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>48888.0</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2017-03-15 00:01:16.551</td>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>48888</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445.0</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2017-03-15 00:01:16.631</td>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>58844</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445.0</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2017-03-15 00:01:16.552</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>48888.0</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451515</th>\n",
              "      <td>2017-03-21 23:59:56.083</td>\n",
              "      <td>0.248</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.200.8</td>\n",
              "      <td>62605</td>\n",
              "      <td>EXT_SERVER</td>\n",
              "      <td>8082.0</td>\n",
              "      <td>2</td>\n",
              "      <td>319</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451516</th>\n",
              "      <td>2017-03-21 23:59:57.037</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>443</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>51433.0</td>\n",
              "      <td>1</td>\n",
              "      <td>54</td>\n",
              "      <td>1</td>\n",
              "      <td>.A....</td>\n",
              "      <td>32</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451517</th>\n",
              "      <td>2017-03-21 23:59:56.920</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>51433</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>443.0</td>\n",
              "      <td>1</td>\n",
              "      <td>55</td>\n",
              "      <td>1</td>\n",
              "      <td>.A....</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451518</th>\n",
              "      <td>2017-03-21 23:59:58.299</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>56281.0</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451519</th>\n",
              "      <td>2017-03-21 23:59:58.298</td>\n",
              "      <td>0.002</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>56281</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>445.0</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>1</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>0</td>\n",
              "      <td>normal</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "      <td>---</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8451520 rows × 16 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "                 Date first seen  Duration  Proto     Src IP Addr  Src Pt  \\\n",
              "0        2017-03-15 00:01:16.632     0.000  TCP     192.168.100.5     445   \n",
              "1        2017-03-15 00:01:16.552     0.000  TCP     192.168.100.5     445   \n",
              "2        2017-03-15 00:01:16.551     0.004  TCP    192.168.220.15   48888   \n",
              "3        2017-03-15 00:01:16.631     0.004  TCP    192.168.220.16   58844   \n",
              "4        2017-03-15 00:01:16.552     0.000  TCP     192.168.100.5     445   \n",
              "...                          ...       ...    ...             ...     ...   \n",
              "8451515  2017-03-21 23:59:56.083     0.248  TCP     192.168.200.8   62605   \n",
              "8451516  2017-03-21 23:59:57.037     0.000  TCP         10179_174     443   \n",
              "8451517  2017-03-21 23:59:56.920     0.000  TCP     192.168.210.5   51433   \n",
              "8451518  2017-03-21 23:59:58.299     0.000  TCP     192.168.100.5     445   \n",
              "8451519  2017-03-21 23:59:58.298     0.002  TCP     192.168.220.6   56281   \n",
              "\n",
              "            Dst IP Addr   Dst Pt  Packets     Bytes  Flows   Flags  Tos  \\\n",
              "0        192.168.220.16  58844.0        1       108      1  .AP...    0   \n",
              "1        192.168.220.15  48888.0        1       108      1  .AP...    0   \n",
              "2         192.168.100.5    445.0        2       174      1  .AP...    0   \n",
              "3         192.168.100.5    445.0        2       174      1  .AP...    0   \n",
              "4        192.168.220.15  48888.0        1       108      1  .AP...    0   \n",
              "...                 ...      ...      ...       ...    ...     ...  ...   \n",
              "8451515      EXT_SERVER   8082.0        2       319      1  .AP...    0   \n",
              "8451516   192.168.210.5  51433.0        1        54      1  .A....   32   \n",
              "8451517       10179_174    443.0        1        55      1  .A....    0   \n",
              "8451518   192.168.220.6  56281.0        1       108      1  .AP...    0   \n",
              "8451519   192.168.100.5    445.0        2       174      1  .AP...    0   \n",
              "\n",
              "          class attackType attackID attackDescription  \n",
              "0        normal        ---      ---               ---  \n",
              "1        normal        ---      ---               ---  \n",
              "2        normal        ---      ---               ---  \n",
              "3        normal        ---      ---               ---  \n",
              "4        normal        ---      ---               ---  \n",
              "...         ...        ...      ...               ...  \n",
              "8451515  normal        ---      ---               ---  \n",
              "8451516  normal        ---      ---               ---  \n",
              "8451517  normal        ---      ---               ---  \n",
              "8451518  normal        ---      ---               ---  \n",
              "8451519  normal        ---      ---               ---  \n",
              "\n",
              "[8451520 rows x 16 columns]"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df = pd.read_csv(\"CIDDS-001/traffic/OpenStack/CIDDS-001-internal-week1.csv\")\n",
        "df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "f61709e7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Date first seen</th>\n",
              "      <th>Duration</th>\n",
              "      <th>Proto</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>Flags</th>\n",
              "      <th>attackType</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2017-03-15 00:01:16.632</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2017-03-15 00:01:16.552</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2017-03-15 00:01:16.551</td>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2017-03-15 00:01:16.631</td>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2017-03-15 00:01:16.552</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451515</th>\n",
              "      <td>2017-03-21 23:59:56.083</td>\n",
              "      <td>0.248</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.200.8</td>\n",
              "      <td>EXT_SERVER</td>\n",
              "      <td>2</td>\n",
              "      <td>319</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451516</th>\n",
              "      <td>2017-03-21 23:59:57.037</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>1</td>\n",
              "      <td>54</td>\n",
              "      <td>.A....</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451517</th>\n",
              "      <td>2017-03-21 23:59:56.920</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>1</td>\n",
              "      <td>55</td>\n",
              "      <td>.A....</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451518</th>\n",
              "      <td>2017-03-21 23:59:58.299</td>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451519</th>\n",
              "      <td>2017-03-21 23:59:58.298</td>\n",
              "      <td>0.002</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>.AP...</td>\n",
              "      <td>benign</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8451520 rows × 9 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "                Date first seen  Duration  Proto     Src IP Addr  \\\n",
              "0       2017-03-15 00:01:16.632     0.000  TCP     192.168.100.5   \n",
              "1       2017-03-15 00:01:16.552     0.000  TCP     192.168.100.5   \n",
              "2       2017-03-15 00:01:16.551     0.004  TCP    192.168.220.15   \n",
              "3       2017-03-15 00:01:16.631     0.004  TCP    192.168.220.16   \n",
              "4       2017-03-15 00:01:16.552     0.000  TCP     192.168.100.5   \n",
              "...                         ...       ...    ...             ...   \n",
              "8451515 2017-03-21 23:59:56.083     0.248  TCP     192.168.200.8   \n",
              "8451516 2017-03-21 23:59:57.037     0.000  TCP         10179_174   \n",
              "8451517 2017-03-21 23:59:56.920     0.000  TCP     192.168.210.5   \n",
              "8451518 2017-03-21 23:59:58.299     0.000  TCP     192.168.100.5   \n",
              "8451519 2017-03-21 23:59:58.298     0.002  TCP     192.168.220.6   \n",
              "\n",
              "            Dst IP Addr  Packets     Bytes   Flags attackType  \n",
              "0        192.168.220.16        1       108  .AP...     benign  \n",
              "1        192.168.220.15        1       108  .AP...     benign  \n",
              "2         192.168.100.5        2       174  .AP...     benign  \n",
              "3         192.168.100.5        2       174  .AP...     benign  \n",
              "4        192.168.220.15        1       108  .AP...     benign  \n",
              "...                 ...      ...       ...     ...        ...  \n",
              "8451515      EXT_SERVER        2       319  .AP...     benign  \n",
              "8451516   192.168.210.5        1        54  .A....     benign  \n",
              "8451517       10179_174        1        55  .A....     benign  \n",
              "8451518   192.168.220.6        1       108  .AP...     benign  \n",
              "8451519   192.168.100.5        2       174  .AP...     benign  \n",
              "\n",
              "[8451520 rows x 9 columns]"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df = df.drop(columns=['Src Pt', 'Dst Pt', 'Flows', 'Tos', 'class', 'attackID', 'attackDescription'])\n",
        "df['attackType'] = df['attackType'].replace('---', 'benign')\n",
        "df['Date first seen'] = pd.to_datetime(df['Date first seen'])\n",
        "df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "13f539c4",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "benign        82.954273\n",
            "dos           14.815406\n",
            "portScan       2.171337\n",
            "pingScan       0.039744\n",
            "bruteForce     0.019239\n",
            "Name: attackType, dtype: float64\n"
          ]
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "count_labels = df['attackType'].value_counts() / len(df) * 100\n",
        "print(count_labels)\n",
        "plt.pie(count_labels[:3], labels=df['attackType'].unique()[:3], autopct='%.0f%%')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "2742d95f",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "image/png": "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gFicludI1ZetW7eqZ8+eqlq1qjIyMvSHP/whIJbXX39drVu3VtWqVdW+fXstXbrUcizhEqmaE+15imQdqozjLR6eQ9rB6jxX3mM6WlgZ93PPPaeePXuqTp06qlOnjnr37m17PQhVqHVt4cKFcrlcGjRoUHgDDBOr4z558qRGjRqlxo0by+12q2XLllH5WLc67lmzZqlVq1aqVq2aMjIy9Jvf/EY//PBDhKKtHOU9ByhNMDUqJCZKLFy40CQnJ5sXX3zRfPLJJ2bkyJGmdu3a5uuvv7Y7tIiYMGGCadu2rTl8+LDv75tvvvFd/7//+78mIyPDrFy50mzcuNFcffXVpnv37jZGXPmWLl1qfve735lFixYZSWbx4sV+10+bNs3UqlXLLFmyxGzZssXccsstpnnz5ub777/3rdOvXz/TsWNH8+GHH5r333/fXHrppeaOO+6I8EgqT3k5GT58uOnXr5/f4+bEiRN+68RaTrKysszcuXPN9u3bzebNm82NN95omjRpYgoKCnzrlHe8nD171rRr18707t3bbNq0ySxdutSkpaWZcePG2TEkREis15mK1pFgjot9+/aZlJQUk52dbT799FPzzDPPmCpVqpjly5f71nFiniNRX06dOmUaNmxohg0bZrZv324WLFhgqlWrZp599lnfOuvWrTNVqlQxf/jDH8ynn35qHnvsMZOUlGS2bdtmKZZwiUTNiYU8RaoOVdbxFg/PISPN6jwXzGM6Glgd99ChQ83s2bPNpk2bzI4dO8zdd99tatWqZb744osIR14xoda1/fv3m4suusj07NnTDBw4MDLBViKr4/Z4PKZr167mxhtvNGvXrjX79+83ubm5ZvPmzRGOvGKsjvvVV181brfbvPrqq2b//v3mnXfeMY0bNza/+c1vIhx5xZT3HODHgqlRoYqaJtZVV11lRo0a5btcVFRk0tPTzdSpU22MKnImTJhgOnbsWOp1J0+eNElJSeb111/3LduxY4eRZNavXx+hCCPrxwdOcXGxadSokfnjH//oW3by5EnjdrvNggULjDHGfPrpp0aS2bBhg2+dZcuWGZfLZb788suIxR4uF3pBUVZRjPWcGGPM0aNHjSSzevVqY0xwx8vSpUtNQkKCOXLkiG+dOXPmmNTUVOPxeCI7AERMrNeZitaRYI6L//f//p9p27at320PGTLEZGVl+S47Pc/hqi9/+ctfTJ06dfzmkEceecS0atXKd3nw4MHmpptu8ounW7du5r777gs6lkgJV82JtTwZE746VBnHWzw+h4wEq/NceY/paFHR+f3s2bOmZs2a5qWXXgpXiGERyrjPnj1runfvbp5//vly506nsjruOXPmmEsuucScOXMmUiGGhdVxjxo1ytxwww1+y7Kzs02PHj3CGmc4BdPECqZGhSoqPk545swZ5eXlqXfv3r5lCQkJ6t27t9avX29jZJG1e/dupaen65JLLtGwYcN06NAhSVJeXp68Xq9fflq3bq0mTZrETX7279+vI0eO+OWgVq1a6tatmy8H69evV+3atdW1a1ffOr1791ZCQoI++uijiMccKbm5uWrQoIFatWqlX/3qVzp+/LjvunjIyalTpyRJdevWlRTc8bJ+/Xq1b99eDRs29K2TlZWl/Px8ffLJJxGMHpESL3WmInUkmONi/fr1frdRsk7JbURjniurvqxfv17XXnutkpOTfetkZWVp165d+vbbb33rlJW/YGKxW0VrTizmKVx1qDKON55DVr5Q5rny7stoUBnze2Fhobxer+9YiQahjnvy5Mlq0KCBfvGLX0QizEoXyrjffPNNZWZmatSoUWrYsKHatWunJ598UkVFRZEKu8JCGXf37t2Vl5fn+8jhvn37tHTpUt14440Ridku4ZzXoqKJdezYMRUVFfkVcklq2LChjhw5YlNUkdWtWzfNmzdPy5cv15w5c7R//3717NlTp0+f1pEjR5ScnKzatWv7bRNP+SkZZ1mPkSNHjqhBgwZ+1ycmJqpu3boxm6d+/frp5Zdf1sqVKzV9+nStXr1a/fv39xWLWM9JcXGxHnzwQfXo0UPt2rWTpKCOlyNHjpT6WCq5DrEnHupMRetIMMfFhdbJz8/X999/H5V5rqz6UpH8nX99ebHYqTJqTqzlKZx1qDKON55DVr5Q5rnyHtPRoDLm90ceeUTp6ekBL3ydLJRxr127Vi+88IKee+65SIQYFqGMe9++ffrnP/+poqIiLV26VOPHj9dTTz2lxx9/PBIhV4pQxj106FBNnjxZ11xzjZKSktSiRQv16tVLv/3tbyMRsm3Kq1EVkVihrREx/fv39/3foUMHdevWTU2bNtVrr72matWq2RgZnOz222/3/d++fXt16NBBLVq0UG5urn7yk5/YGFlkjBo1Stu3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uEFbtmyRdK4uTpo0SVu2bPHVy3nz5skYo4kTJ6pJkyZyu91KT0/XAw88UOr+ACBSqEPW65AknT179oJ1aPLkyWrXrl3ANldccYXGjx+viRMn6qWXXtIbb7zhqxMlr9U+//xzDR48WLVr11bdunU1cOBAHThwwHcbubm5uuqqq1S9enXVrl1bPXr00MGDBy8YJyJj9OjRWr9+vRYuXKitW7fqtttuU79+/bR7925J0ltvvaVLLrlEb7/9tpo3b65mzZrp3nvv1YkTJyzviyYWot4NN9ygjh07atGiRZa2e/TRRzVt2jTt2LFDHTp0UEFBgW688UatXLlSmzZtUr9+/TRgwAAdOnRIkrRo0SJdfPHFmjx5sg4fPqzDhw+XeruLFy/WmDFj9NBDD2n79u267777NGLECL333nt+602aNEmDBw/W1q1bdeONN2rYsGEhHcQAEM2qVKmiJ598Us8884y++OKLCt3WqlWr9NVXX2nNmjWaOXOmJkyYoJtvvll16tTRRx99pP/93//VfffdF7Cfhx9+WA899JA2bdqkzMxMDRgwQMePH5d0rllzww03qFOnTtq4caOWL1+ur7/+WoMHD/a7jZdeeknJyclat26d/vrXv5Ya39NPP62nnnpKM2bM0NatW5WVlaVbbrnF9wTv8OHDatu2rR566CEdPnxYY8eOveBYX3rpJSUmJurjjz/W008/rZkzZ+r555/3Xe/1ejVlyhRt2bJFS5Ys0YEDB3T33Xf7rv/yyy917bXXyu12a9WqVcrLy9M999xT6juTV61apT59+uiJJ57QI488Ikm67bbbdPToUS1btkx5eXnq3LmzfvKTn+jEiRMaMmSIHnroIbVt29ZXL4cMGaJ//etf+tOf/qRnn31Wu3fv1pIlS9S+ffsy7lEACD/qUOXXoXvuuUc7duzQhg0bfOtv2rRJW7du1YgRIzR27FgNHjzY9ymbw4cPq3v37vJ6vcrKylLNmjX1/vvva926dapRo4b69eunM2fO6OzZsxo0aJCuu+46bd26VevXr9cvf/nLuP3op1McOnRIc+fO1euvv66ePXuqRYsWGjt2rK655hpf03bfvn06ePCgXn/9db388suaN2+e8vLy9POf/9z6Dg0QJYYPH24GDhxY6nVDhgwxbdq0Mfv37zeSzKZNm3zXffvtt0aSee+994wxxrz33ntGklmyZEm5+2zbtq155plnfJebNm1q/vSnP/mtM3fuXFOrVi3f5e7du5uRI0f6rXPbbbeZG2+80XdZknnsscd8lwsKCowks2zZsnJjAoBYcf68fvXVV5t77rnHGGPM4sWLzflPUSZMmGA6duzot+2f/vQn07RpU7/batq0qSkqKvIta9WqlenZs6fv8tmzZ0316tXNggULjDHGVzOmTZvmW8fr9ZqLL77YTJ8+3RhjzJQpU0zfvn399v35558bSWbXrl3GGGOuu+4606lTp3LHm56ebp544gm/ZVdeeaW5//77fZc7duxoJkyYUObtXHfddaZNmzamuLjYt+yRRx4xbdq0ueA2GzZsMJLM6dOnjTHGjBs3zjRv3tycOXOm1PVL7ptFixaZGjVqmIULF/que//9901qaqr54Ycf/LZp0aKFefbZZ40xpd9nTz31lGnZsuUF9wkAkUYdCl8d6t+/v/nVr37lu/zrX//a9OrVy3e5tNd2r7zyimnVqpXf7Xo8HlOtWjXzzjvvmOPHjxtJJjc3t9yxInwkmcWLF/suv/3220aSqV69ut9fYmKiGTx4sDHGmJEjR/o9Zo0xJi8vz0gyO3futLR/3omFmGCMsdyB79q1q9/lgoICjR07Vm3atFHt2rVVo0YN7dixw/dOrGDt2LFDPXr08FvWo0cP7dixw29Zhw4dfP9Xr15dqampAR/1AIB4MX36dL300ksBc6UVbdu2VULCf5/aNGzY0O+dPlWqVFG9evUC5trMzEzf/4mJieratasvji1btui9995TjRo1fH+tW7eWJL+P3nXp0qXM2PLz8/XVV18FVR+CcfXVV/vVvczMTO3evVtFRUWSpLy8PA0YMEBNmjRRzZo1dd1110mSr6Zt3rxZPXv2VFJS0gX38dFHH+m2227TK6+8oiFDhviWb9myRQUFBapXr55fXvbv33/BjyNK59699f333+uSSy7RyJEjtXjx4gp9JyUAVCbqkDXl1aGRI0dqwYIF+uGHH3TmzBnNnz9f99xzT5m3uWXLFu3Zs0c1a9b0jbVu3br64YcftHfvXtWtW1d33323srKyNGDAAD399NMX/HQMIqegoEBVqlRRXl6eNm/e7PvbsWOHnn76aUlS48aNlZiYqJYtW/q2a9OmjSRZfr2dWHmhA/bZsWOHmjdv7isa5rzvBfF6vaVuU716db/LY8eOVU5OjmbMmKFLL71U1apV089//vMKfTFiWX78wsHlckXsVxYBwGmuvfZaZWVlady4cX4fe5OkhIQEv3ldKn1uL21erehcW1BQoAEDBvi+C+p8jRs39v3/45pip++++05ZWVnKysrSq6++qvr16+vQoUPKysry1bRq1aqVezstWrRQvXr19OKLL+qmm27y5bKgoECNGzf2+8LWEj/+jsjzZWRkaNeuXXr33XeVk5Oj+++/X3/84x+1evXqMptpABAJ1KHKNWDAALndbi1evFjJycnyer3lfnSsoKBAXbp00auvvhpwXf369SVJc+fO1QMPPKDly5frH//4hx577DHl5OTo6quvDss4UL5OnTqpqKhIR48eVc+ePUtdp0ePHjp79qz27t2rFi1aSJI+++wzSVLTpk0t7Y93YiHqrVq1Stu2bdPPfvYz3+R2fkf+/C95L8u6det0991369Zbb1X79u3VqFEjvy8RlKTk5GTf2YULadOmjdatWxdw25dffnlQcQBAvJo2bZreeustrV+/3m95/fr1deTIEb8XEMHO7cH48MMPff+fPXtWeXl5vrODnTt31ieffKJmzZrp0ksv9fuz8oIhNTVV6enplVYfPvroo4AxXHbZZapSpYp27typ48ePa9q0aerZs6dat24dcNa/Q4cOev/99y94okeS0tLStGrVKu3Zs0eDBw/2rdu5c2cdOXJEiYmJATlJS0uTdOF6Wa1aNQ0YMEB//vOflZubq/Xr12vbtm2Wxw8A4UAdCl5ZdUg6946y4cOHa+7cuZo7d65uv/12vxMopdWJzp07a/fu3WrQoEHAWGvVquVbr1OnTho3bpw++OADtWvXTvPnz7ccP6wpKCjwvcNKkvbv36/Nmzfr0KFDatmypYYNG6a77rpLixYt0v79+/Xxxx9r6tSp+ve//y3p3A8odO7cWffcc482bdqkvLw83XffferTp4/fu7OCQRMLUcXj8ejIkSP68ssv9Z///EdPPvmkBg4cqJtvvll33XWXqlWrpquvvtr3he2rV6/WY489FtRtX3bZZVq0aJE2b96sLVu2aOjQoQFnSZo1a6Y1a9boyy+/9PtFkPM9/PDDmjdvnubMmaPdu3dr5syZWrRoUZlfjAgAkNq3b69hw4bpz3/+s9/yXr166ZtvvtEf/vAH7d27V7Nnz9ayZcsqbb+zZ8/W4sWLtXPnTo0aNUrffvut7yMPo0aN0okTJ3THHXdow4YN2rt3r9555x2NGDGi3JMaP/bwww9r+vTp+sc//qFdu3bp0Ucf1ebNmzVmzBjLMR86dEjZ2dnatWuXFixYoGeeecZ3O02aNFFycrKeeeYZ7du3T2+++aamTJnit/3o0aOVn5+v22+/XRs3btTu3bv1yiuvaNeuXX7rNWjQQKtWrdLOnTt1xx136OzZs+rdu7cyMzM1aNAgrVixQgcOHNAHH3yg3/3ud9q4caOkc/Wy5AnusWPH5PF4NG/ePL3wwgvavn279u3bp7///e+qVq2a5TOwABAu1KHglVWHStx7771atWqVli9fHvBRwmbNmmnr1q3atWuXjh07Jq/Xq2HDhiktLU0DBw7U+++/r/379ys3N1cPPPCAvvjiC+3fv1/jxo3T+vXrdfDgQa1YsUK7d+/2NfwQPhs3blSnTp3UqVMnSVJ2drY6deqk3//+95LOvUPurrvu0kMPPaRWrVpp0KBB2rBhg5o0aSLp3LsZ33rrLaWlpenaa6/VTTfdpDZt2mjhwoWWY6GJhaiyfPlyNW7cWM2aNVO/fv303nvv6c9//rPeeOMNX9f/xRdf1NmzZ9WlSxc9+OCDevzxx4O67ZkzZ6pOnTrq3r27BgwYoKysLHXu3NlvncmTJ+vAgQNq0aKF711fPzZo0CA9/fTTmjFjhtq2batnn31Wc+fOVa9evSo0dgCIB5MnTw44gdCmTRv95S9/0ezZs9WxY0d9/PHHlXpiYNq0aZo2bZo6duyotWvX6s033/S9o6jkrHVRUZH69u2r9u3b68EHH1Tt2rX9vvckGA888ICys7P10EMPqX379lq+fLnefPNNXXbZZZZjvuuuu/T999/rqquu0qhRozRmzBj98pe/lHTuHQPz5s3T66+/rssvv1zTpk3TjBkz/LavV6+eVq1apYKCAl133XXq0qWLnnvuuVI/1teoUSPfu56HDRum4uJiLV26VNdee61GjBihli1b6vbbb9fBgwfVsGFDSdLPfvYz9evXT9dff73q16+vBQsWqHbt2nruuefUo0cPdejQQe+++67eeust1atXz/L4ASBcqEPBKasOlbjsssvUvXt3tW7dWt26dfO7buTIkWrVqpW6du2q+vXra926dUpJSdGaNWvUpEkT/fSnP1WbNm30i1/8Qj/88INSU1OVkpKinTt36mc/+5latmypX/7ylxo1apTuu+8+y/HDml69eskYE/A3b948Sec+Sjtp0iTt379fZ86c0VdffaVFixb5fSdcenq6/vWvf+n06dM6cuSI5s6dq7p161qOxWV+/OFeAAAAOFavXr10xRVXaNasWXaHAgDABRljdNlll+n+++9Xdna23eEgRvDF7gAAAAAAoNJ88803WrhwoY4cOaIRI0bYHQ5iCE0sAAAAAABQaRo0aKC0tDT97W9/U506dewOBzGEjxMCAAAAAADA8fhidwAAAAAAADgeTSwAAAAAAAA4Hk0sAAAAAAAAOB5NLAAAAAAAADgeTSwAAAAAAAA4Hk0sAAAAAAAAOB5NLAAAAAAAADgeTSwAAAAAAAA4Hk0sAAAAAAAAON7/B4ewMV2eE2+JAAAAAElFTkSuQmCC",
            "text/plain": [
              "<Figure size 1500x500 with 3 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "fig, ((ax1, ax2, ax3)) = plt.subplots(1, 3, figsize=(15,5))\n",
        "df['Duration'].hist(ax=ax1)\n",
        "ax1.set_xlabel(\"Duration\")\n",
        "df['Packets'].hist(ax=ax2)\n",
        "ax2.set_xlabel(\"Number of packets\")\n",
        "pd.to_numeric(df['Bytes'], errors='coerce').hist(ax=ax3)\n",
        "ax3.set_xlabel(\"Number of bytes\")\n",
        "plt.show()"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d03b8186",
      "metadata": {},
      "source": [
        "## Preprocessing the CIDDS-001 dataset"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "2d62571b",
      "metadata": {},
      "outputs": [],
      "source": [
        "df['weekday'] = df['Date first seen'].dt.weekday\n",
        "df = pd.get_dummies(df, columns=['weekday']).rename(columns = {'weekday_0': 'Monday',\n",
        "                                                              'weekday_1': 'Tuesday',\n",
        "                                                              'weekday_2': 'Wednesday',\n",
        "                                                              'weekday_3': 'Thursday',\n",
        "                                                              'weekday_4': 'Friday',\n",
        "                                                              'weekday_5': 'Saturday',\n",
        "                                                              'weekday_6': 'Sunday',\n",
        "                                                             })\n",
        "\n",
        "df['daytime'] = (df['Date first seen'].dt.second +df['Date first seen'].dt.minute*60 + df['Date first seen'].dt.hour*60*60)/(24*60*60)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "71e581b8-1a9f-4b77-a0b9-742ecd36c558",
      "metadata": {
        "id": "71e581b8-1a9f-4b77-a0b9-742ecd36c558"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Duration</th>\n",
              "      <th>Proto</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>attackType</th>\n",
              "      <th>Monday</th>\n",
              "      <th>Tuesday</th>\n",
              "      <th>Wednesday</th>\n",
              "      <th>Thursday</th>\n",
              "      <th>Friday</th>\n",
              "      <th>Saturday</th>\n",
              "      <th>Sunday</th>\n",
              "      <th>daytime</th>\n",
              "      <th>ACK</th>\n",
              "      <th>PSH</th>\n",
              "      <th>RST</th>\n",
              "      <th>SYN</th>\n",
              "      <th>FIN</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.000880</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.000880</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.000880</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.000880</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.000880</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451515</th>\n",
              "      <td>0.248</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.200.8</td>\n",
              "      <td>EXT_SERVER</td>\n",
              "      <td>2</td>\n",
              "      <td>319</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.999954</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451516</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>1</td>\n",
              "      <td>54</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.999965</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451517</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>10179_174</td>\n",
              "      <td>1</td>\n",
              "      <td>55</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.999954</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451518</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.999977</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8451519</th>\n",
              "      <td>0.002</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.999977</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8451520 rows × 20 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "         Duration  Proto     Src IP Addr     Dst IP Addr  Packets     Bytes  \\\n",
              "0           0.000  TCP     192.168.100.5  192.168.220.16        1       108   \n",
              "1           0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "2           0.004  TCP    192.168.220.15   192.168.100.5        2       174   \n",
              "3           0.004  TCP    192.168.220.16   192.168.100.5        2       174   \n",
              "4           0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "...           ...    ...             ...             ...      ...       ...   \n",
              "8451515     0.248  TCP     192.168.200.8      EXT_SERVER        2       319   \n",
              "8451516     0.000  TCP         10179_174   192.168.210.5        1        54   \n",
              "8451517     0.000  TCP     192.168.210.5       10179_174        1        55   \n",
              "8451518     0.000  TCP     192.168.100.5   192.168.220.6        1       108   \n",
              "8451519     0.002  TCP     192.168.220.6   192.168.100.5        2       174   \n",
              "\n",
              "        attackType  Monday  Tuesday  Wednesday  Thursday  Friday  Saturday  \\\n",
              "0           benign       0        0          1         0       0         0   \n",
              "1           benign       0        0          1         0       0         0   \n",
              "2           benign       0        0          1         0       0         0   \n",
              "3           benign       0        0          1         0       0         0   \n",
              "4           benign       0        0          1         0       0         0   \n",
              "...            ...     ...      ...        ...       ...     ...       ...   \n",
              "8451515     benign       0        1          0         0       0         0   \n",
              "8451516     benign       0        1          0         0       0         0   \n",
              "8451517     benign       0        1          0         0       0         0   \n",
              "8451518     benign       0        1          0         0       0         0   \n",
              "8451519     benign       0        1          0         0       0         0   \n",
              "\n",
              "         Sunday   daytime  ACK  PSH  RST  SYN  FIN  \n",
              "0             0  0.000880    1    1    0    0    0  \n",
              "1             0  0.000880    1    1    0    0    0  \n",
              "2             0  0.000880    1    1    0    0    0  \n",
              "3             0  0.000880    1    1    0    0    0  \n",
              "4             0  0.000880    1    1    0    0    0  \n",
              "...         ...       ...  ...  ...  ...  ...  ...  \n",
              "8451515       0  0.999954    1    1    0    0    0  \n",
              "8451516       0  0.999965    1    0    0    0    0  \n",
              "8451517       0  0.999954    1    0    0    0    0  \n",
              "8451518       0  0.999977    1    1    0    0    0  \n",
              "8451519       0  0.999977    1    1    0    0    0  \n",
              "\n",
              "[8451520 rows x 20 columns]"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "def one_hot_flags(input):\n",
        "    return [1 if char1 == char2 else 0 for char1, char2 in zip('APRSF', input[1:])]\n",
        "\n",
        "df = df.reset_index(drop=True)\n",
        "ohe_flags = one_hot_flags(df['Flags'].to_numpy())\n",
        "ohe_flags = df['Flags'].apply(one_hot_flags).to_list()\n",
        "df[['ACK', 'PSH', 'RST', 'SYN', 'FIN']] = pd.DataFrame(ohe_flags, columns=['ACK', 'PSH', 'RST', 'SYN', 'FIN'])\n",
        "df = df.drop(columns=['Date first seen', 'Flags'])\n",
        "df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "7c81f1be",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Duration</th>\n",
              "      <th>Proto</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>attackType</th>\n",
              "      <th>Monday</th>\n",
              "      <th>Tuesday</th>\n",
              "      <th>Wednesday</th>\n",
              "      <th>Thursday</th>\n",
              "      <th>Friday</th>\n",
              "      <th>Saturday</th>\n",
              "      <th>Sunday</th>\n",
              "      <th>daytime</th>\n",
              "      <th>ACK</th>\n",
              "      <th>PSH</th>\n",
              "      <th>RST</th>\n",
              "      <th>SYN</th>\n",
              "      <th>FIN</th>\n",
              "      <th>ipsrc_1</th>\n",
              "      <th>ipsrc_2</th>\n",
              "      <th>ipsrc_3</th>\n",
              "      <th>ipsrc_4</th>\n",
              "      <th>ipsrc_5</th>\n",
              "      <th>ipsrc_6</th>\n",
              "      <th>ipsrc_7</th>\n",
              "      <th>ipsrc_8</th>\n",
              "      <th>ipsrc_9</th>\n",
              "      <th>ipsrc_10</th>\n",
              "      <th>ipsrc_11</th>\n",
              "      <th>ipsrc_12</th>\n",
              "      <th>ipsrc_13</th>\n",
              "      <th>ipsrc_14</th>\n",
              "      <th>ipsrc_15</th>\n",
              "      <th>ipsrc_16</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "   Duration  Proto     Src IP Addr     Dst IP Addr  Packets     Bytes  \\\n",
              "0     0.000  TCP     192.168.100.5  192.168.220.16        1       108   \n",
              "1     0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "2     0.004  TCP    192.168.220.15   192.168.100.5        2       174   \n",
              "3     0.004  TCP    192.168.220.16   192.168.100.5        2       174   \n",
              "4     0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "\n",
              "  attackType  Monday  Tuesday  Wednesday  Thursday  Friday  Saturday  Sunday  \\\n",
              "0     benign       0        0          1         0       0         0       0   \n",
              "1     benign       0        0          1         0       0         0       0   \n",
              "2     benign       0        0          1         0       0         0       0   \n",
              "3     benign       0        0          1         0       0         0       0   \n",
              "4     benign       0        0          1         0       0         0       0   \n",
              "\n",
              "   daytime  ACK  PSH  RST  SYN  FIN  ipsrc_1  ipsrc_2  ipsrc_3  ipsrc_4  \\\n",
              "0  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "1  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "2  0.00088    1    1    0    0    0        1        1        0        1   \n",
              "3  0.00088    1    1    0    0    0        1        1        0        1   \n",
              "4  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "\n",
              "   ipsrc_5  ipsrc_6  ipsrc_7  ipsrc_8  ipsrc_9  ipsrc_10  ipsrc_11  ipsrc_12  \\\n",
              "0        0        1        0        0        0         0         0         0   \n",
              "1        0        1        0        0        0         0         0         0   \n",
              "2        1        1        0        0        0         0         0         0   \n",
              "3        1        1        0        0        0         0         0         1   \n",
              "4        0        1        0        0        0         0         0         0   \n",
              "\n",
              "   ipsrc_13  ipsrc_14  ipsrc_15  ipsrc_16  \n",
              "0         0         1         0         1  \n",
              "1         0         1         0         1  \n",
              "2         1         1         1         1  \n",
              "3         0         0         0         0  \n",
              "4         0         1         0         1  "
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "temp = pd.DataFrame()\n",
        "temp['SrcIP'] = df['Src IP Addr'].astype(str)\n",
        "temp['SrcIP'][~temp['SrcIP'].str.contains('\\d{1,3}\\.', regex=True)] = '0.0.0.0'\n",
        "temp = temp['SrcIP'].str.split('.', expand=True).rename(columns = {2: 'ipsrc3', 3: 'ipsrc4'}).astype(int)[['ipsrc3', 'ipsrc4']]\n",
        "temp['ipsrc'] = temp['ipsrc3'].apply(lambda x: format(x, \"b\").zfill(8)) + temp['ipsrc4'].apply(lambda x: format(x, \"b\").zfill(8))\n",
        "df = df.join(temp['ipsrc'].str.split('', expand=True)\n",
        "            .drop(columns=[0, 17])\n",
        "            .rename(columns=dict(enumerate([f'ipsrc_{i}' for i in range(17)])))\n",
        "            .astype('int32'))\n",
        "df.head(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "dd4cb89f",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Duration</th>\n",
              "      <th>Proto</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>attackType</th>\n",
              "      <th>Monday</th>\n",
              "      <th>Tuesday</th>\n",
              "      <th>Wednesday</th>\n",
              "      <th>Thursday</th>\n",
              "      <th>Friday</th>\n",
              "      <th>Saturday</th>\n",
              "      <th>Sunday</th>\n",
              "      <th>daytime</th>\n",
              "      <th>ACK</th>\n",
              "      <th>PSH</th>\n",
              "      <th>RST</th>\n",
              "      <th>SYN</th>\n",
              "      <th>FIN</th>\n",
              "      <th>ipsrc_1</th>\n",
              "      <th>ipsrc_2</th>\n",
              "      <th>ipsrc_3</th>\n",
              "      <th>ipsrc_4</th>\n",
              "      <th>ipsrc_5</th>\n",
              "      <th>ipsrc_6</th>\n",
              "      <th>ipsrc_7</th>\n",
              "      <th>ipsrc_8</th>\n",
              "      <th>ipsrc_9</th>\n",
              "      <th>ipsrc_10</th>\n",
              "      <th>ipsrc_11</th>\n",
              "      <th>ipsrc_12</th>\n",
              "      <th>ipsrc_13</th>\n",
              "      <th>ipsrc_14</th>\n",
              "      <th>ipsrc_15</th>\n",
              "      <th>ipsrc_16</th>\n",
              "      <th>ipdst_1</th>\n",
              "      <th>ipdst_2</th>\n",
              "      <th>ipdst_3</th>\n",
              "      <th>ipdst_4</th>\n",
              "      <th>ipdst_5</th>\n",
              "      <th>ipdst_6</th>\n",
              "      <th>ipdst_7</th>\n",
              "      <th>ipdst_8</th>\n",
              "      <th>ipdst_9</th>\n",
              "      <th>ipdst_10</th>\n",
              "      <th>ipdst_11</th>\n",
              "      <th>ipdst_12</th>\n",
              "      <th>ipdst_13</th>\n",
              "      <th>ipdst_14</th>\n",
              "      <th>ipdst_15</th>\n",
              "      <th>ipdst_16</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.004</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.000</td>\n",
              "      <td>TCP</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>benign</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "   Duration  Proto     Src IP Addr     Dst IP Addr  Packets     Bytes  \\\n",
              "0     0.000  TCP     192.168.100.5  192.168.220.16        1       108   \n",
              "1     0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "2     0.004  TCP    192.168.220.15   192.168.100.5        2       174   \n",
              "3     0.004  TCP    192.168.220.16   192.168.100.5        2       174   \n",
              "4     0.000  TCP     192.168.100.5  192.168.220.15        1       108   \n",
              "\n",
              "  attackType  Monday  Tuesday  Wednesday  Thursday  Friday  Saturday  Sunday  \\\n",
              "0     benign       0        0          1         0       0         0       0   \n",
              "1     benign       0        0          1         0       0         0       0   \n",
              "2     benign       0        0          1         0       0         0       0   \n",
              "3     benign       0        0          1         0       0         0       0   \n",
              "4     benign       0        0          1         0       0         0       0   \n",
              "\n",
              "   daytime  ACK  PSH  RST  SYN  FIN  ipsrc_1  ipsrc_2  ipsrc_3  ipsrc_4  \\\n",
              "0  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "1  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "2  0.00088    1    1    0    0    0        1        1        0        1   \n",
              "3  0.00088    1    1    0    0    0        1        1        0        1   \n",
              "4  0.00088    1    1    0    0    0        0        1        1        0   \n",
              "\n",
              "   ipsrc_5  ipsrc_6  ipsrc_7  ipsrc_8  ipsrc_9  ipsrc_10  ipsrc_11  ipsrc_12  \\\n",
              "0        0        1        0        0        0         0         0         0   \n",
              "1        0        1        0        0        0         0         0         0   \n",
              "2        1        1        0        0        0         0         0         0   \n",
              "3        1        1        0        0        0         0         0         1   \n",
              "4        0        1        0        0        0         0         0         0   \n",
              "\n",
              "   ipsrc_13  ipsrc_14  ipsrc_15  ipsrc_16  ipdst_1  ipdst_2  ipdst_3  ipdst_4  \\\n",
              "0         0         1         0         1        1        1        0        1   \n",
              "1         0         1         0         1        1        1        0        1   \n",
              "2         1         1         1         1        0        1        1        0   \n",
              "3         0         0         0         0        0        1        1        0   \n",
              "4         0         1         0         1        1        1        0        1   \n",
              "\n",
              "   ipdst_5  ipdst_6  ipdst_7  ipdst_8  ipdst_9  ipdst_10  ipdst_11  ipdst_12  \\\n",
              "0        1        1        0        0        0         0         0         1   \n",
              "1        1        1        0        0        0         0         0         0   \n",
              "2        0        1        0        0        0         0         0         0   \n",
              "3        0        1        0        0        0         0         0         0   \n",
              "4        1        1        0        0        0         0         0         0   \n",
              "\n",
              "   ipdst_13  ipdst_14  ipdst_15  ipdst_16  \n",
              "0         0         0         0         0  \n",
              "1         1         1         1         1  \n",
              "2         0         1         0         1  \n",
              "3         0         1         0         1  \n",
              "4         1         1         1         1  "
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "temp = pd.DataFrame()\n",
        "temp['DstIP'] = df['Dst IP Addr'].astype(str)\n",
        "temp['DstIP'][~temp['DstIP'].str.contains('\\d{1,3}\\.', regex=True)] = '0.0.0.0'\n",
        "temp = temp['DstIP'].str.split('.', expand=True).rename(columns = {2: 'ipdst3', 3: 'ipdst4'}).astype(int)[['ipdst3', 'ipdst4']]\n",
        "temp['ipdst'] = temp['ipdst3'].apply(lambda x: format(x, \"b\").zfill(8)) \\\n",
        "                + temp['ipdst4'].apply(lambda x: format(x, \"b\").zfill(8))\n",
        "df = df.join(temp['ipdst'].str.split('', expand=True)\n",
        "            .drop(columns=[0, 17])\n",
        "            .rename(columns=dict(enumerate([f'ipdst_{i}' for i in range(17)])))\n",
        "            .astype('int32'))\n",
        "df.head(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "7e6d0b97",
      "metadata": {},
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "d:\\Programs\\Anaconda\\envs\\gnnbook\\lib\\site-packages\\pandas\\core\\indexing.py:1732: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  self._setitem_single_block(indexer, value, name)\n",
            "d:\\Programs\\Anaconda\\envs\\gnnbook\\lib\\site-packages\\pandas\\core\\dtypes\\cast.py:339: RuntimeWarning: invalid value encountered in cast\n",
            "  new_result = trans(result).astype(dtype)\n"
          ]
        }
      ],
      "source": [
        "m_index = df[pd.to_numeric(df['Bytes'], errors='coerce').isnull() == True].index\n",
        "df['Bytes'].loc[m_index] = df['Bytes'].loc[m_index].apply(lambda x: 10e6 * float(x.strip().split()[0]))\n",
        "df['Bytes'] = pd.to_numeric(df['Bytes'], errors='coerce', downcast='integer')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "9871c708",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Duration</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>Monday</th>\n",
              "      <th>Tuesday</th>\n",
              "      <th>Wednesday</th>\n",
              "      <th>Thursday</th>\n",
              "      <th>Friday</th>\n",
              "      <th>Saturday</th>\n",
              "      <th>Sunday</th>\n",
              "      <th>daytime</th>\n",
              "      <th>ACK</th>\n",
              "      <th>PSH</th>\n",
              "      <th>RST</th>\n",
              "      <th>SYN</th>\n",
              "      <th>FIN</th>\n",
              "      <th>ipsrc_1</th>\n",
              "      <th>ipsrc_2</th>\n",
              "      <th>ipsrc_3</th>\n",
              "      <th>ipsrc_4</th>\n",
              "      <th>ipsrc_5</th>\n",
              "      <th>ipsrc_6</th>\n",
              "      <th>ipsrc_7</th>\n",
              "      <th>ipsrc_8</th>\n",
              "      <th>ipsrc_9</th>\n",
              "      <th>ipsrc_10</th>\n",
              "      <th>ipsrc_11</th>\n",
              "      <th>ipsrc_12</th>\n",
              "      <th>ipsrc_13</th>\n",
              "      <th>ipsrc_14</th>\n",
              "      <th>ipsrc_15</th>\n",
              "      <th>ipsrc_16</th>\n",
              "      <th>ipdst_1</th>\n",
              "      <th>ipdst_2</th>\n",
              "      <th>ipdst_3</th>\n",
              "      <th>ipdst_4</th>\n",
              "      <th>ipdst_5</th>\n",
              "      <th>ipdst_6</th>\n",
              "      <th>ipdst_7</th>\n",
              "      <th>ipdst_8</th>\n",
              "      <th>ipdst_9</th>\n",
              "      <th>ipdst_10</th>\n",
              "      <th>ipdst_11</th>\n",
              "      <th>ipdst_12</th>\n",
              "      <th>ipdst_13</th>\n",
              "      <th>ipdst_14</th>\n",
              "      <th>ipdst_15</th>\n",
              "      <th>ipdst_16</th>\n",
              "      <th>ICMP</th>\n",
              "      <th>IGMP</th>\n",
              "      <th>TCP</th>\n",
              "      <th>UDP</th>\n",
              "      <th>benign</th>\n",
              "      <th>bruteForce</th>\n",
              "      <th>dos</th>\n",
              "      <th>pingScan</th>\n",
              "      <th>portScan</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.000</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.000</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.004</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.004</td>\n",
              "      <td>192.168.220.16</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>2</td>\n",
              "      <td>174</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.000</td>\n",
              "      <td>192.168.100.5</td>\n",
              "      <td>192.168.220.15</td>\n",
              "      <td>1</td>\n",
              "      <td>108</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.00088</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "   Duration     Src IP Addr     Dst IP Addr  Packets  Bytes  Monday  Tuesday  \\\n",
              "0     0.000   192.168.100.5  192.168.220.16        1    108       0        0   \n",
              "1     0.000   192.168.100.5  192.168.220.15        1    108       0        0   \n",
              "2     0.004  192.168.220.15   192.168.100.5        2    174       0        0   \n",
              "3     0.004  192.168.220.16   192.168.100.5        2    174       0        0   \n",
              "4     0.000   192.168.100.5  192.168.220.15        1    108       0        0   \n",
              "\n",
              "   Wednesday  Thursday  Friday  Saturday  Sunday  daytime  ACK  PSH  RST  SYN  \\\n",
              "0          1         0       0         0       0  0.00088    1    1    0    0   \n",
              "1          1         0       0         0       0  0.00088    1    1    0    0   \n",
              "2          1         0       0         0       0  0.00088    1    1    0    0   \n",
              "3          1         0       0         0       0  0.00088    1    1    0    0   \n",
              "4          1         0       0         0       0  0.00088    1    1    0    0   \n",
              "\n",
              "   FIN  ipsrc_1  ipsrc_2  ipsrc_3  ipsrc_4  ipsrc_5  ipsrc_6  ipsrc_7  \\\n",
              "0    0        0        1        1        0        0        1        0   \n",
              "1    0        0        1        1        0        0        1        0   \n",
              "2    0        1        1        0        1        1        1        0   \n",
              "3    0        1        1        0        1        1        1        0   \n",
              "4    0        0        1        1        0        0        1        0   \n",
              "\n",
              "   ipsrc_8  ipsrc_9  ipsrc_10  ipsrc_11  ipsrc_12  ipsrc_13  ipsrc_14  \\\n",
              "0        0        0         0         0         0         0         1   \n",
              "1        0        0         0         0         0         0         1   \n",
              "2        0        0         0         0         0         1         1   \n",
              "3        0        0         0         0         1         0         0   \n",
              "4        0        0         0         0         0         0         1   \n",
              "\n",
              "   ipsrc_15  ipsrc_16  ipdst_1  ipdst_2  ipdst_3  ipdst_4  ipdst_5  ipdst_6  \\\n",
              "0         0         1        1        1        0        1        1        1   \n",
              "1         0         1        1        1        0        1        1        1   \n",
              "2         1         1        0        1        1        0        0        1   \n",
              "3         0         0        0        1        1        0        0        1   \n",
              "4         0         1        1        1        0        1        1        1   \n",
              "\n",
              "   ipdst_7  ipdst_8  ipdst_9  ipdst_10  ipdst_11  ipdst_12  ipdst_13  \\\n",
              "0        0        0        0         0         0         1         0   \n",
              "1        0        0        0         0         0         0         1   \n",
              "2        0        0        0         0         0         0         0   \n",
              "3        0        0        0         0         0         0         0   \n",
              "4        0        0        0         0         0         0         1   \n",
              "\n",
              "   ipdst_14  ipdst_15  ipdst_16  ICMP   IGMP   TCP    UDP    benign  \\\n",
              "0         0         0         0      0      0      1      0       1   \n",
              "1         1         1         1      0      0      1      0       1   \n",
              "2         1         0         1      0      0      1      0       1   \n",
              "3         1         0         1      0      0      1      0       1   \n",
              "4         1         1         1      0      0      1      0       1   \n",
              "\n",
              "   bruteForce  dos  pingScan  portScan  \n",
              "0           0    0         0         0  \n",
              "1           0    0         0         0  \n",
              "2           0    0         0         0  \n",
              "3           0    0         0         0  \n",
              "4           0    0         0         0  "
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df = pd.get_dummies(df, prefix='', prefix_sep='', columns=['Proto', 'attackType'])\n",
        "df.head(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "94ede5ca",
      "metadata": {},
      "outputs": [],
      "source": [
        "labels = ['benign', 'bruteForce', 'dos', 'pingScan', 'portScan']\n",
        "df_train, df_test = train_test_split(df, random_state=0, test_size=0.2, stratify=df[labels])\n",
        "df_val, df_test = train_test_split(df_test, random_state=0, test_size=0.5, stratify=df_test[labels])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "418cca67-31ca-4ea3-95bb-646673772280",
      "metadata": {
        "id": "418cca67-31ca-4ea3-95bb-646673772280"
      },
      "outputs": [],
      "source": [
        "scaler = PowerTransformer()\n",
        "df_train[['Duration', 'Packets', 'Bytes']] = scaler.fit_transform(df_train[['Duration', 'Packets', 'Bytes']])\n",
        "df_val[['Duration', 'Packets', 'Bytes']] = scaler.transform(df_val[['Duration', 'Packets', 'Bytes']])\n",
        "df_test[['Duration', 'Packets', 'Bytes']] = scaler.transform(df_test[['Duration', 'Packets', 'Bytes']])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "931bec8d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Duration</th>\n",
              "      <th>Src IP Addr</th>\n",
              "      <th>Dst IP Addr</th>\n",
              "      <th>Packets</th>\n",
              "      <th>Bytes</th>\n",
              "      <th>Monday</th>\n",
              "      <th>Tuesday</th>\n",
              "      <th>Wednesday</th>\n",
              "      <th>Thursday</th>\n",
              "      <th>Friday</th>\n",
              "      <th>Saturday</th>\n",
              "      <th>Sunday</th>\n",
              "      <th>daytime</th>\n",
              "      <th>ACK</th>\n",
              "      <th>PSH</th>\n",
              "      <th>RST</th>\n",
              "      <th>SYN</th>\n",
              "      <th>FIN</th>\n",
              "      <th>ipsrc_1</th>\n",
              "      <th>ipsrc_2</th>\n",
              "      <th>ipsrc_3</th>\n",
              "      <th>ipsrc_4</th>\n",
              "      <th>ipsrc_5</th>\n",
              "      <th>ipsrc_6</th>\n",
              "      <th>ipsrc_7</th>\n",
              "      <th>ipsrc_8</th>\n",
              "      <th>ipsrc_9</th>\n",
              "      <th>ipsrc_10</th>\n",
              "      <th>ipsrc_11</th>\n",
              "      <th>ipsrc_12</th>\n",
              "      <th>ipsrc_13</th>\n",
              "      <th>ipsrc_14</th>\n",
              "      <th>ipsrc_15</th>\n",
              "      <th>ipsrc_16</th>\n",
              "      <th>ipdst_1</th>\n",
              "      <th>ipdst_2</th>\n",
              "      <th>ipdst_3</th>\n",
              "      <th>ipdst_4</th>\n",
              "      <th>ipdst_5</th>\n",
              "      <th>ipdst_6</th>\n",
              "      <th>ipdst_7</th>\n",
              "      <th>ipdst_8</th>\n",
              "      <th>ipdst_9</th>\n",
              "      <th>ipdst_10</th>\n",
              "      <th>ipdst_11</th>\n",
              "      <th>ipdst_12</th>\n",
              "      <th>ipdst_13</th>\n",
              "      <th>ipdst_14</th>\n",
              "      <th>ipdst_15</th>\n",
              "      <th>ipdst_16</th>\n",
              "      <th>ICMP</th>\n",
              "      <th>IGMP</th>\n",
              "      <th>TCP</th>\n",
              "      <th>UDP</th>\n",
              "      <th>benign</th>\n",
              "      <th>bruteForce</th>\n",
              "      <th>dos</th>\n",
              "      <th>pingScan</th>\n",
              "      <th>portScan</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>4632132</th>\n",
              "      <td>-0.586004</td>\n",
              "      <td>192.168.210.5</td>\n",
              "      <td>10402_46</td>\n",
              "      <td>-0.991987</td>\n",
              "      <td>-1.286741</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.706123</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1197644</th>\n",
              "      <td>-0.586004</td>\n",
              "      <td>DNS</td>\n",
              "      <td>192.168.200.4</td>\n",
              "      <td>-0.991987</td>\n",
              "      <td>-0.075276</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.643044</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8146328</th>\n",
              "      <td>-0.586004</td>\n",
              "      <td>192.168.220.14</td>\n",
              "      <td>11251_120</td>\n",
              "      <td>-0.991987</td>\n",
              "      <td>-1.007791</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.666296</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8345249</th>\n",
              "      <td>-0.586004</td>\n",
              "      <td>10261_101</td>\n",
              "      <td>192.168.220.14</td>\n",
              "      <td>-0.991987</td>\n",
              "      <td>-1.007791</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.754410</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5474885</th>\n",
              "      <td>-0.484600</td>\n",
              "      <td>192.168.220.6</td>\n",
              "      <td>DNS</td>\n",
              "      <td>0.119968</td>\n",
              "      <td>-0.052850</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.383588</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>642681</th>\n",
              "      <td>1.987779</td>\n",
              "      <td>10032_128</td>\n",
              "      <td>192.168.220.5</td>\n",
              "      <td>0.119968</td>\n",
              "      <td>0.086917</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.515069</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1766100</th>\n",
              "      <td>2.377145</td>\n",
              "      <td>12990_115</td>\n",
              "      <td>192.168.220.4</td>\n",
              "      <td>1.191420</td>\n",
              "      <td>1.506611</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.383437</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7146759</th>\n",
              "      <td>2.154645</td>\n",
              "      <td>192.168.200.8</td>\n",
              "      <td>11062_193</td>\n",
              "      <td>0.119968</td>\n",
              "      <td>1.168069</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.388970</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5818547</th>\n",
              "      <td>0.077875</td>\n",
              "      <td>192.168.220.10</td>\n",
              "      <td>10346_13</td>\n",
              "      <td>0.119968</td>\n",
              "      <td>-0.067723</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.453600</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5760126</th>\n",
              "      <td>-0.586004</td>\n",
              "      <td>11062_193</td>\n",
              "      <td>192.168.220.14</td>\n",
              "      <td>-0.991987</td>\n",
              "      <td>-1.007791</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0.433218</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5608717 rows × 59 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "         Duration     Src IP Addr     Dst IP Addr   Packets     Bytes  Monday  \\\n",
              "4632132 -0.586004   192.168.210.5        10402_46 -0.991987 -1.286741       0   \n",
              "1197644 -0.586004             DNS   192.168.200.4 -0.991987 -0.075276       0   \n",
              "8146328 -0.586004  192.168.220.14       11251_120 -0.991987 -1.007791       0   \n",
              "8345249 -0.586004       10261_101  192.168.220.14 -0.991987 -1.007791       0   \n",
              "5474885 -0.484600   192.168.220.6             DNS  0.119968 -0.052850       1   \n",
              "...           ...             ...             ...       ...       ...     ...   \n",
              "642681   1.987779       10032_128   192.168.220.5  0.119968  0.086917       0   \n",
              "1766100  2.377145       12990_115   192.168.220.4  1.191420  1.506611       0   \n",
              "7146759  2.154645   192.168.200.8       11062_193  0.119968  1.168069       0   \n",
              "5818547  0.077875  192.168.220.10        10346_13  0.119968 -0.067723       1   \n",
              "5760126 -0.586004       11062_193  192.168.220.14 -0.991987 -1.007791       1   \n",
              "\n",
              "         Tuesday  Wednesday  Thursday  Friday  Saturday  Sunday   daytime  \\\n",
              "4632132        0          0         0       1         0       0  0.706123   \n",
              "1197644        0          1         0       0         0       0  0.643044   \n",
              "8146328        1          0         0       0         0       0  0.666296   \n",
              "8345249        1          0         0       0         0       0  0.754410   \n",
              "5474885        0          0         0       0         0       0  0.383588   \n",
              "...          ...        ...       ...     ...       ...     ...       ...   \n",
              "642681         0          1         0       0         0       0  0.515069   \n",
              "1766100        0          0         1       0         0       0  0.383437   \n",
              "7146759        1          0         0       0         0       0  0.388970   \n",
              "5818547        0          0         0       0         0       0  0.453600   \n",
              "5760126        0          0         0       0         0       0  0.433218   \n",
              "\n",
              "         ACK  PSH  RST  SYN  FIN  ipsrc_1  ipsrc_2  ipsrc_3  ipsrc_4  ipsrc_5  \\\n",
              "4632132    1    0    0    0    0        1        1        0        1        0   \n",
              "1197644    0    0    0    0    0        0        0        0        0        0   \n",
              "8146328    1    0    0    0    0        1        1        0        1        1   \n",
              "8345249    1    0    0    0    1        0        0        0        0        0   \n",
              "5474885    0    0    0    0    0        1        1        0        1        1   \n",
              "...      ...  ...  ...  ...  ...      ...      ...      ...      ...      ...   \n",
              "642681     1    1    0    0    1        0        0        0        0        0   \n",
              "1766100    1    1    0    0    0        0        0        0        0        0   \n",
              "7146759    1    1    0    0    0        1        1        0        0        1   \n",
              "5818547    1    0    0    1    0        1        1        0        1        1   \n",
              "5760126    1    0    0    0    1        0        0        0        0        0   \n",
              "\n",
              "         ipsrc_6  ipsrc_7  ipsrc_8  ipsrc_9  ipsrc_10  ipsrc_11  ipsrc_12  \\\n",
              "4632132        0        1        0        0         0         0         0   \n",
              "1197644        0        0        0        0         0         0         0   \n",
              "8146328        1        0        0        0         0         0         0   \n",
              "8345249        0        0        0        0         0         0         0   \n",
              "5474885        1        0        0        0         0         0         0   \n",
              "...          ...      ...      ...      ...       ...       ...       ...   \n",
              "642681         0        0        0        0         0         0         0   \n",
              "1766100        0        0        0        0         0         0         0   \n",
              "7146759        0        0        0        0         0         0         0   \n",
              "5818547        1        0        0        0         0         0         0   \n",
              "5760126        0        0        0        0         0         0         0   \n",
              "\n",
              "         ipsrc_13  ipsrc_14  ipsrc_15  ipsrc_16  ipdst_1  ipdst_2  ipdst_3  \\\n",
              "4632132         0         1         0         1        0        0        0   \n",
              "1197644         0         0         0         0        1        1        0   \n",
              "8146328         1         1         1         0        0        0        0   \n",
              "8345249         0         0         0         0        1        1        0   \n",
              "5474885         0         1         1         0        0        0        0   \n",
              "...           ...       ...       ...       ...      ...      ...      ...   \n",
              "642681          0         0         0         0        1        1        0   \n",
              "1766100         0         0         0         0        1        1        0   \n",
              "7146759         1         0         0         0        0        0        0   \n",
              "5818547         1         0         1         0        0        0        0   \n",
              "5760126         0         0         0         0        1        1        0   \n",
              "\n",
              "         ipdst_4  ipdst_5  ipdst_6  ipdst_7  ipdst_8  ipdst_9  ipdst_10  \\\n",
              "4632132        0        0        0        0        0        0         0   \n",
              "1197644        0        1        0        0        0        0         0   \n",
              "8146328        0        0        0        0        0        0         0   \n",
              "8345249        1        1        1        0        0        0         0   \n",
              "5474885        0        0        0        0        0        0         0   \n",
              "...          ...      ...      ...      ...      ...      ...       ...   \n",
              "642681         1        1        1        0        0        0         0   \n",
              "1766100        1        1        1        0        0        0         0   \n",
              "7146759        0        0        0        0        0        0         0   \n",
              "5818547        0        0        0        0        0        0         0   \n",
              "5760126        1        1        1        0        0        0         0   \n",
              "\n",
              "         ipdst_11  ipdst_12  ipdst_13  ipdst_14  ipdst_15  ipdst_16  ICMP   \\\n",
              "4632132         0         0         0         0         0         0      0   \n",
              "1197644         0         0         0         1         0         0      0   \n",
              "8146328         0         0         0         0         0         0      0   \n",
              "8345249         0         0         1         1         1         0      0   \n",
              "5474885         0         0         0         0         0         0      0   \n",
              "...           ...       ...       ...       ...       ...       ...    ...   \n",
              "642681          0         0         0         1         0         1      0   \n",
              "1766100         0         0         0         1         0         0      0   \n",
              "7146759         0         0         0         0         0         0      0   \n",
              "5818547         0         0         0         0         0         0      0   \n",
              "5760126         0         0         1         1         1         0      0   \n",
              "\n",
              "         IGMP   TCP    UDP    benign  bruteForce  dos  pingScan  portScan  \n",
              "4632132      0      1      0       1           0    0         0         0  \n",
              "1197644      0      0      1       1           0    0         0         0  \n",
              "8146328      0      1      0       1           0    0         0         0  \n",
              "8345249      0      1      0       1           0    0         0         0  \n",
              "5474885      0      0      1       1           0    0         0         0  \n",
              "...        ...    ...    ...     ...         ...  ...       ...       ...  \n",
              "642681       0      1      0       1           0    0         0         0  \n",
              "1766100      0      1      0       1           0    0         0         0  \n",
              "7146759      0      1      0       1           0    0         0         0  \n",
              "5818547      0      1      0       1           0    0         0         0  \n",
              "5760126      0      1      0       1           0    0         0         0  \n",
              "\n",
              "[5608717 rows x 59 columns]"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_train[df_train['benign'] == 1]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "dc809cea",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "image/png": "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VVu2bNHevXs1YsQIjR49WidPnpQkvfrqq2rdurVmz56toqIiFRUVVXrctWvXaurUqXrggQe0f/9+/epXv9LEiRP11ltvubWbNWuWbr/9dn344Ye69dZbdeedd+qrr77ybhAAIETVq1dPTz75pJ599ll9+umndTrW1q1b9dlnn2n79u165pln9Pjjj+u2227TNddco927d+u+++7Tr371qwrnmT59uh544AHt3btXKSkpGj16tL788ktJ3xdrbrnlFvXq1Ut79uzRxo0bVVJSottvv93tGH/5y1/UoEEDvf3221q2bFml8S1evFgLFizQ/Pnz9eGHHyo9PV3/3//3/+nw4cOSpKKiInXt2lUPPPCAioqK9OCDD1aZ61/+8hfVr19f7777rhYvXqxnnnlGL7zwgutxh8OhOXPm6IMPPtC6det0/Phx3XXXXa7HT506pZtvvllWq1Vbt25Vfn6+7r777kqvTN66dauGDRumJ554Qv/zP/8jSRo7dqxOnz6tN954Q/n5+erdu7d+9KMf6auvvtIdd9yhBx54QF27dnXNl3fccYf++c9/auHChVq+fLkOHz6sdevWqXv37tU8owDgf8xDvp+H7r77bh08eFDvvfeeq/3evXv14YcfauLEiXrwwQd1++23u+6yKSoqUmpqqhwOh9LT09WkSRP95z//0dtvv63GjRtrxIgRunDhgi5evKiMjAwNHjxYH374oXbt2qV77733qr3186plACFiwoQJxpgxYyp97I477jCSkpKMY8eOGZKMvXv3uh77+uuvDUnGW2+9ZRiGYbz11luGJGPdunU1nrNr167Gs88+69pu166dsXDhQrc2K1euNJo2beraTk1NNSZPnuzWZuzYscatt97q2pZkPPLII67tsrIyQ5Lxxhtv1BgTAISLy3+vDxw40Lj77rsNwzCMtWvXGpf/L8rjjz9uJCcnu/VduHCh0a5dO7djtWvXzigvL3ftS0xMNG666SbX9sWLF41GjRoZL7/8smEYhmvOmDt3rquNw+EwWrdubcybN88wDMOYM2eOMXz4cLdzf/LJJ4Yko7Cw0DAMwxg8eLDRq1evGvNt1aqV8cQTT7jt69evn/Gb3/zGtZ2cnGw8/vjj1R5n8ODBRlJSkuF0Ol37/ud//sdISkqqss97771nSDK+/fZbwzAMIzs72+jQoYNx4cKFSttfem5effVVo3Hjxsbq1atdj/3nP/8xYmJijPPnz7v1ueGGG4zly5cbhlH5c7ZgwQLjxhtvrPKcABBozEP+m4dGjhxp/PrXv3Zt33///UZaWppru7LPdi+99JKRmJjodly73W40bNjQ2LRpk/Hll18akoy8vLwac0X44koshAXDMDyuwPft29dtu6ysTA8++KCSkpLUrFkzNW7cWAcPHnRdiVVbBw8e1KBBg9z2DRo0SAcPHnTb16NHD9e/GzVqpJiYmAq3egDA1WLevHn6y1/+UuF3pSe6du2qiIgf/tcmLi7O7UqfevXqqUWLFhV+16akpLj+Xb9+ffXt29cVxwcffKC33npLjRs3dv107txZktxuvevTp0+1sZWWluqzzz6r1fxQGwMHDnSb91JSUnT48GGVl5dLkvLz8zV69Gi1bdtWTZo00eDBgyXJNacVFBTopptuUmRkZJXn2L17t8aOHauXXnpJd9xxh2v/Bx98oLKyMrVo0cJtXI4dO1bl7YjS91dvfffdd7r++us1efJkrV27tk5rUgKALzEPeaameWjy5Ml6+eWXdf78eV24cEGrVq3S3XffXe0xP/jgAx05ckRNmjRx5dq8eXOdP39eR48eVfPmzXXXXXcpPT1do0eP1uLFi6u8Owbhq36wAwB84eDBg+rQoYNr0jAuWxfE4XBU2qdRo0Zu2w8++KBsNpvmz5+vjh07qmHDhvrZz35Wp4URq3PlBweLxRKwb1kEALO5+eablZ6eruzsbLfb3iQpIiLC7fe6VPnv9sp+r9b1d21ZWZlGjx7tWgvqcgkJCa5/XzmnBNPZs2eVnp6u9PR0/e1vf9O1116rkydPKj093TWnNWzYsMbj3HDDDWrRooVWrFihUaNGucayrKxMCQkJrvVLLnflGpGXa9OmjQoLC/Xmm2/KZrPpN7/5jZ5++mlt27at2mIaAAQC85BvjR49WlarVWvXrlWDBg3kcDj0s5/9rNo+ZWVl6tOnj/72t79VeOzaa6+VJK1cuVK//e1vtXHjRr3yyit65JFHZLPZNHDgQL/kAfPhSiyEvK1bt2rfvn366U9/6vrldnlF/vJF3qvz9ttv66677tKPf/xjde/eXfHx8W6LCEpSgwYNXH9dqEpSUpLefvvtCsfu0qVLreIAgKvV3Llz9e9//1u7du1y23/ttdequLjY7QNEbX+318Y777zj+vfFixeVn5+vpKQkSVLv3r114MABtW/fXh07dnT78eQDQ0xMjFq1auWz+WH37t0VcujUqZPq1aunQ4cO6csvv9TcuXN10003qXPnzhX+6t+jRw/95z//qfIPPZLUsmVLbd26VUeOHNHtt9/uatu7d28VFxerfv36FcakZcuWkqqeLxs2bKjRo0frD3/4g/Ly8rRr1y7t27fP4/wBwB+Yh2qvunlI+v6KsgkTJmjlypVauXKlfv7zn7v9AaWyeaJ37946fPiwYmNjK+TatGlTV7tevXopOztbO3fuVLdu3bRq1SqP40foooiFkGK321VcXKxTp07p/fff15NPPqkxY8botttu0/jx49WwYUMNHDjQtWD7tm3b9Mgjj9Tq2J06ddKrr76qgoICffDBB/rFL35R4a8k7du31/bt23Xq1Cm3bwS53PTp05Wbm6ulS5fq8OHDeuaZZ/Tqq69WuzAiAEDq3r277rzzTv3hD39w25+WlqbPP/9cTz31lI4ePaolS5bojTfe8Nl5lyxZorVr1+rQoUPKzMzU119/7brlITMzU1999ZXGjRun9957T0ePHtWmTZs0ceLEGv+ocaXp06dr3rx5euWVV1RYWKgZM2aooKBAU6dO9TjmkydPKisrS4WFhXr55Zf17LPPuo7Ttm1bNWjQQM8++6w+/vhj/etf/9KcOXPc+k+ZMkWlpaX6+c9/rj179ujw4cN66aWXVFhY6NYuNjZWW7du1aFDhzRu3DhdvHhRQ4cOVUpKijIyMrR582YdP35cO3fu1P/+7/9qz549kr6fL48dO6aCggJ98cUXstvtys3N1Z///Gft379fH3/8sf7617+qYcOGateuncf5A4A/MA/VXnXz0CWTJk3S1q1btXHjxgq3ErZv314ffvihCgsL9cUXX8jhcOjOO+9Uy5YtNWbMGP3nP//RsWPHlJeXp9/+9rf69NNPdezYMWVnZ2vXrl06ceKENm/erMOHD7sKfrg6UMRCSNm4caMSEhLUvn17jRgxQm+99Zb+8Ic/aP369a6q/4oVK3Tx4kX16dNH06ZN0+9///taHfuZZ57RNddco9TUVI0ePVrp6enq3bu3W5vZs2fr+PHjuuGGG1xXfV0pIyNDixcv1vz589W1a1ctX75cK1euVFpaWp1yB4CrwezZsyv8ASEpKUl//OMftWTJEiUnJ+vdd9/16R8G5s6dq7lz5yo5OVk7duzQv/71L9cVRZf+al1eXq7hw4ere/fumjZtmpo1a+a27klt/Pa3v1VWVpYeeOABde/eXRs3btS//vUvderUyeOYx48fr++++079+/dXZmampk6dqnvvvVfS91cM5Obmas2aNerSpYvmzp2r+fPnu/Vv0aKFtm7dqrKyMg0ePFh9+vTRn/70p0pv64uPj3dd9XznnXfK6XRqw4YNuvnmmzVx4kTdeOON+vnPf64TJ04oLi5OkvTTn/5UI0aM0JAhQ3Tttdfq5ZdfVrNmzfSnP/1JgwYNUo8ePfTmm2/q3//+t1q0aOFx/gDgL8xDtVPdPHRJp06dlJqaqs6dO2vAgAFuj02ePFmJiYnq27evrr32Wr399tuKjo7W9u3b1bZtW/3kJz9RUlKS7rnnHp0/f14xMTGKjo7WoUOH9NOf/lQ33nij7r33XmVmZupXv/qVx/EjdFmMK2/uBQAAgGmlpaWpZ8+eWrRoUbBDAQCgSoZhqFOnTvrNb36jrKysYIeDMMHC7gAAAAAAwGc+//xzrV69WsXFxZo4cWKww0EYoYgFAAAAAAB8JjY2Vi1bttTzzz+va665JtjhIIxwOyEAAAAAAABMj4XdAQAAAAAAYHoUsQAAAAAAAGB6FLEAAAAAAABgehSxAAAAAAAAYHoUsQAAAAAAAGB6FLEAAAAAAABgehSxAAAAAAAAYHoUsQAAAAAAAGB6FLEAAAAAAABgev8/pm8tGFEJ1gYAAAAASUVORK5CYII=",
            "text/plain": [
              "<Figure size 1500x500 with 3 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "fig, ((ax1, ax2, ax3)) = plt.subplots(1, 3, figsize=(15,5))\n",
        "df_train['Duration'].hist(ax=ax1)\n",
        "ax1.set_xlabel(\"Duration\")\n",
        "df_train['Packets'].hist(ax=ax2)\n",
        "ax2.set_xlabel(\"Number of packets\")\n",
        "df_train['Bytes'].hist(ax=ax3)\n",
        "ax3.set_xlabel(\"Number of bytes\")\n",
        "plt.show()"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "a170b2cc",
      "metadata": {},
      "source": [
        "## Implementing a heterogeneous GNN"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "e9f4bd8a",
      "metadata": {},
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "C:\\Users\\labon\\AppData\\Local\\Temp\\ipykernel_20976\\368988823.py:12: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at C:\\actions-runner\\_work\\pytorch\\pytorch\\builder\\windows\\pytorch\\torch\\csrc\\utils\\tensor_new.cpp:233.)\n",
            "  return torch.Tensor([src, dst]).int(), torch.Tensor([dst, src]).int()\n"
          ]
        }
      ],
      "source": [
        "BATCH_SIZE = 16\n",
        "features_host = [f'ipsrc_{i}' for i in range(1, 17)] + [f'ipdst_{i}' for i in range(1, 17)]\n",
        "features_flow = ['daytime', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Duration', 'Packets', 'Bytes', 'ACK', 'PSH', 'RST', 'SYN', 'FIN', 'ICMP ', 'IGMP ', 'TCP  ', 'UDP  ']\n",
        "\n",
        "def get_connections(ip_map, src_ip, dst_ip):\n",
        "    src1 = [ip_map[ip] for ip in src_ip]\n",
        "    src2 = [ip_map[ip] for ip in dst_ip]\n",
        "    src = np.column_stack((src1, src2)).flatten()\n",
        "    dst = list(range(len(src_ip)))\n",
        "    dst = np.column_stack((dst, dst)).flatten()\n",
        "    \n",
        "    return torch.Tensor([src, dst]).int(), torch.Tensor([dst, src]).int()\n",
        "\n",
        "def create_dataloader(df, subgraph_size=1024):\n",
        "    data = []\n",
        "    n_subgraphs = len(df) // subgraph_size\n",
        "    for i in range(1, n_subgraphs+1):\n",
        "        subgraph = df[(i-1)*subgraph_size:i*subgraph_size]\n",
        "        src_ip = subgraph['Src IP Addr'].to_numpy()\n",
        "        dst_ip = subgraph['Dst IP Addr'].to_numpy()\n",
        "        \n",
        "        ip_map = {ip:index for index, ip in enumerate(np.unique(np.append(src_ip, dst_ip)))}\n",
        "        host_to_flow, flow_to_host = get_connections(ip_map, src_ip, dst_ip)\n",
        "\n",
        "        batch = HeteroData()\n",
        "        batch['host'].x = torch.Tensor(subgraph[features_host].to_numpy()).float()\n",
        "        batch['flow'].x = torch.Tensor(subgraph[features_flow].to_numpy()).float()\n",
        "        batch['flow'].y = torch.Tensor(subgraph[labels].to_numpy()).float()\n",
        "        batch['host','flow'].edge_index = host_to_flow\n",
        "        batch['flow','host'].edge_index = flow_to_host\n",
        "        data.append(batch)\n",
        "\n",
        "    return DataLoader(data, batch_size=BATCH_SIZE)\n",
        "\n",
        "train_loader = create_dataloader(df_train)\n",
        "val_loader = create_dataloader(df_val)\n",
        "test_loader = create_dataloader(df_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "id": "PItgsCxCwkOa",
      "metadata": {
        "id": "PItgsCxCwkOa"
      },
      "outputs": [],
      "source": [
        "from torch_geometric.nn import Linear, HeteroConv, SAGEConv, GATConv\n",
        "\n",
        "class HeteroGNN(torch.nn.Module):\n",
        "    def __init__(self, dim_h, dim_out, num_layers):\n",
        "        super().__init__()\n",
        "\n",
        "        self.convs = torch.nn.ModuleList()\n",
        "        for _ in range(num_layers):\n",
        "            conv = HeteroConv({\n",
        "                ('host', 'to', 'flow'): SAGEConv((-1,-1), dim_h, add_self_loops=False),\n",
        "                ('flow', 'to', 'host'): SAGEConv((-1,-1), dim_h, add_self_loops=False),\n",
        "            }, aggr='sum')\n",
        "            self.convs.append(conv)\n",
        "\n",
        "        self.lin = Linear(dim_h, dim_out)\n",
        "\n",
        "    def forward(self, x_dict, edge_index_dict):\n",
        "        for conv in self.convs:\n",
        "            x_dict = conv(x_dict, edge_index_dict)\n",
        "            x_dict = {key: F.leaky_relu(x) for key, x in x_dict.items()}\n",
        "        return self.lin(x_dict['flow'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "id": "iXkq0p17wsaz",
      "metadata": {
        "id": "iXkq0p17wsaz"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 0 | Loss: 0.1046 | Val loss: 0.0067 | Val F1-score: 0.6660\n",
            "Epoch 10 | Loss: 0.0019 | Val loss: 0.0019 | Val F1-score: 0.8818\n",
            "Epoch 20 | Loss: 0.0015 | Val loss: 0.0016 | Val F1-score: 0.9050\n",
            "Epoch 30 | Loss: 0.0012 | Val loss: 0.0013 | Val F1-score: 0.9289\n",
            "Epoch 40 | Loss: 0.0010 | Val loss: 0.0011 | Val F1-score: 0.9382\n",
            "Epoch 50 | Loss: 0.0008 | Val loss: 0.0011 | Val F1-score: 0.9417\n",
            "Epoch 60 | Loss: 0.0006 | Val loss: 0.0009 | Val F1-score: 0.9708\n",
            "Epoch 70 | Loss: 0.0005 | Val loss: 0.0009 | Val F1-score: 0.9707\n",
            "Epoch 80 | Loss: 0.0004 | Val loss: 0.0009 | Val F1-score: 0.9722\n",
            "Epoch 90 | Loss: 0.0004 | Val loss: 0.0010 | Val F1-score: 0.9718\n",
            "Epoch 100 | Loss: 0.0004 | Val loss: 0.0010 | Val F1-score: 0.9770\n"
          ]
        }
      ],
      "source": [
        "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
        "model = HeteroGNN(dim_h=64, dim_out=5, num_layers=3).to(device)\n",
        "optimizer = Adam(model.parameters(), lr=0.001)\n",
        "\n",
        "@torch.no_grad()\n",
        "def test(loader):\n",
        "    model.eval()\n",
        "    y_pred = []\n",
        "    y_true = []\n",
        "    n_subgraphs = 0\n",
        "    total_loss = 0\n",
        "\n",
        "    for batch in loader:\n",
        "        batch.to(device)\n",
        "        out = model(batch.x_dict, batch.edge_index_dict)\n",
        "        loss = F.cross_entropy(out, batch['flow'].y.float())\n",
        "        y_pred.append(out.argmax(dim=1))\n",
        "        y_true.append(batch['flow'].y.argmax(dim=1))\n",
        "        n_subgraphs += BATCH_SIZE\n",
        "        total_loss += float(loss) * BATCH_SIZE\n",
        "        \n",
        "    y_pred = torch.cat(y_pred).cpu()\n",
        "    y_true = torch.cat(y_true).cpu()\n",
        "    f1score = f1_score(y_true, y_pred, average='macro')\n",
        "\n",
        "    return total_loss/n_subgraphs, f1score, y_pred, y_true\n",
        "\n",
        "\n",
        "model.train()\n",
        "for epoch in range(101):\n",
        "    n_subgraphs = 0\n",
        "    total_loss = 0\n",
        "\n",
        "    for batch in train_loader:\n",
        "        optimizer.zero_grad()\n",
        "        batch.to(device)\n",
        "        out = model(batch.x_dict, batch.edge_index_dict)\n",
        "        loss = F.cross_entropy(out, batch['flow'].y.float())\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "\n",
        "        n_subgraphs += BATCH_SIZE\n",
        "        total_loss += float(loss) * BATCH_SIZE\n",
        "\n",
        "    if epoch % 10 == 0:\n",
        "        val_loss, f1score, _, _ = test(val_loader)\n",
        "        print(f'Epoch {epoch} | Loss: {total_loss/n_subgraphs:.4f} | Val loss: {val_loss:.4f} | Val F1-score: {f1score:.4f}')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "id": "gReL6iFzw3IV",
      "metadata": {
        "id": "gReL6iFzw3IV"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "      benign     0.9999    0.9999    0.9999    700791\n",
            "  bruteForce     0.9691    0.9691    0.9691       162\n",
            "         dos     1.0000    1.0000    1.0000    125164\n",
            "    pingScan     0.9503    0.9673    0.9587       336\n",
            "    portScan     0.9940    0.9960    0.9950     18347\n",
            "\n",
            "    accuracy                         0.9998    844800\n",
            "   macro avg     0.9827    0.9864    0.9845    844800\n",
            "weighted avg     0.9998    0.9998    0.9998    844800\n",
            "\n"
          ]
        }
      ],
      "source": [
        "_, _, y_pred, y_true = test(test_loader)\n",
        "\n",
        "print(classification_report(y_true, y_pred, target_names=labels, digits=4))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "c471d27a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "([<matplotlib.patches.Wedge at 0x1b35cf4ad90>,\n",
              "  <matplotlib.patches.Wedge at 0x1b35cf5e340>,\n",
              "  <matplotlib.patches.Wedge at 0x1b35cf5e9d0>,\n",
              "  <matplotlib.patches.Wedge at 0x1b35cf720a0>,\n",
              "  <matplotlib.patches.Wedge at 0x1b35cf72730>],\n",
              " [Text(-0.08806255534752426, 1.096469327589999, 'benign'),\n",
              "  Text(-0.26193025843006296, -1.0683597426516784, 'bruteForce'),\n",
              "  Text(0.9832887684496442, -0.4930955260806795, 'dos'),\n",
              "  Text(1.0762061152368232, -0.22755306529876937, 'pingScan'),\n",
              "  Text(1.0977399271690325, -0.07047731762012079, 'portScan')],\n",
              " [Text(-0.04803412109864959, 0.5980741786854539, '53%'),\n",
              "  Text(-0.1428710500527616, -0.5827416778100063, '37%'),\n",
              "  Text(0.5363393282452604, -0.268961196044007, '6%'),\n",
              "  Text(0.5870215174019034, -0.12411985379932873, '3%'),\n",
              "  Text(0.5987672330012904, -0.03844217324733861, '2%')])"
            ]
          },
          "execution_count": 22,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "df_pred = pd.DataFrame([y_pred.numpy(), y_true.numpy()]).T\n",
        "df_pred.columns = ['pred', 'true']\n",
        "plt.pie(df_pred['true'][df_pred['pred'] != df_pred['true']].value_counts(), labels=labels, autopct='%.0f%%')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "id": "412b94cb",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAGwCAYAAAC+Qv9QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACtpElEQVR4nOzdeVxN6R/A8c9tTymJNhNFyZpdyjKWBmOfMcz4oeyDLNnH2PdhSLJl38YyGEOWscta2XeyZVchimhR/f6Iy1WISrf6vud1Xi/3Oc8553ueuff23Gc7iqSkpCSEEEIIIbIxjawOQAghhBAivaRCI4QQQohsTyo0QgghhMj2pEIjhBBCiGxPKjRCCCGEyPakQiOEEEKIbE8qNEIIIYTI9rSyOgCRfomJidy/f5+8efOiUCiyOhwhhBCfKSkpiWfPnmFlZYWGRua1NcTExBAXF5fu8+jo6KCnp5cBEWUcqdDkAPfv38fa2jqrwxBCCJFOd+7c4ZtvvsmUc8fExKCf1xRevUj3uSwsLAgJCVGrSo1UaHKAvHnzAqBTyh2Fpk4WR6Peru+ektUhZAvaWtIbLTKOLEj/ac+eRWFvW1j5fZ4Z4uLi4NULdEu5Q3r+ViTEEXpxGXFxcVKhERnrTTeTQlNHKjSfYGRklNUhZAtSoREZSSo0afdVhg1o6aXrb0WSQj2/H6RCI4QQQuQmCiA9FSc1HaopFRohhBAiN1FoJG/pOV4NqWdUQgghhBCfQVpohBBCiNxEoUhnl5N69jlJhUYIIYTITaTLSQghhBBCPUkLjRBCCJGbSJeTEEIIIbK/dHY5qWnnjnpGJYQQQgjxGaSFRgghhMhNpMtJCCGEENmezHISQgghhFBP0kIjhBBC5CbS5SSEEEKIbC+HdjlJhUYIIYTITXJoC416VrOEEEIIIT6DtNAIIYQQuYl0OQkhhBAi21Mo0lmhkS4nIYQQQohMIS00QgghRG6ioUje0nO8GpIKjRBCCJGb5NAxNOoZlcg0l7eO4eWpWSm26b+1BkBXR4vpv7Xm7r7JPDw8jdVTu2CWP6/KOawtTNjg053HR7y4tWcSEz1boKn56bdSwxqlObB8IBEBXtzfP4W1Xl1V9lcqVZhtvr15cGAK9/dPwW+2B2WLF1LJ4+pckv3LBhB+aCq3905i9dQuFLbMn85SyVpef07GSF+TIQP7ZXUoast3zmwc7GzIZ6hHTRcnjh09mtUhqR0po5SePXvGoAGeONjZkN8oD3VqVef48WPK/WFhYXTr3JGiRQphamxAsybfc+3q1SyMWKSHVGhymRrt/sTGdahya9R9JgAbdp0CYMrAljSuVYa2gxdRv4s3lgWNWTOti/J4DQ0FG3x6oKOtRZ0O0+g6cgXtmjkxskfjj163Rb3yLBrvxnK/QKr+/Ad1O3rx93/HlfsN9HXYNNuDO6FPqNV+KvU6evH8RQx+sz3Q0kp+mxaxMmXd9G74H7uC0y9/0KznbEzzGbBmWtcPXVbtnTh+jCWL5lOmrGNWh6K21q39myGD+jNs+CgCjp7E0bEczRo3IDw8PKtDUxtSRqnr+WtX9u7ezaIlyzl28iz1XL+jScPvuHfvHklJSfz80w+EhNxg7T8bCTh6ksKFC9P4+++Ijo7O6tAz15t1aNKzqSGp0OQyj548J+zxM+XWqGYZrt9+yMETVzEy1KNDC2eGeG1g/7ErnLp0h26j/sK5fDGqlrUBkltISha1oNOwZZy9co+dhy8yds5Wfm1dC20tzVSvqampwdRBLfndeyML1x/i2u1wLt8I5Z/XlSgAB1sLTPMZMG7uFq7eCufSjVAmzPsPiwJGyhaYiqWs0dTQYPTsLYTcfcTpy3fxXr6Hcg6FlJWe7OT58+d06dgenznzyJfPJKvDUVs+3l507NwVtw4dKVmqFDPn+KKfJw/Lli7O6tDUhpRRSi9fvmTjv/8wftJkatSsRTE7O4aPHE3RYnYsmDeXa1evcjQokBkz51C5chWKOzjgM2suMS9fsvbv1VkdfuZ60+WUnk0NqWdU4qvQ1tLkl0ZVWLYpAIAKJQujo63F3sBgZZ4rN8O4/SACJ0dbAJwcbTl/7T7hEc+UeXYduYRxXn1KFbNM9ToVSlhTyNyExMQkAlYP4cbOCWyc1UMl/5WbYTx68hz3Fi5oa2mip6tNhxbOXLrxgFv3IwA4efEOiUmJuDWvhoaGAiNDPf7XuCp7g4J59Soxw8snsw3w7EWDho2oU9c1q0NRW3FxcZw6eYK69d6WkYaGBnXrunI0MCALI1MfUkape/XqFQkJCejp6amk6+vrE3DkMLGxsQAq+zU0NNDR1SXg8OGvGqvIGFKhycWa1XEkX159/tocBICFqRGxcfFEPn+pki/8cRTmpkYAmJsaEf74mer+iKjkfQWMUr2O7TcFABjevRGTF+6gZV9fnka9ZMeCvpgY5QHg+YtYGnSdQZtGVXgSOJ1Hh6fxnUtJWvSaQ0JCcmXl1v3HNOk5mzG9mhIZ5E3YwakUMs9Hu8HZ71fo+rVrOHP6FKPHTczqUNTao0ePSEhIwMzMXCXdzNyc0NDQLIpKvUgZpS5v3rw4VXPmj4njuX//PgkJCaxe+RdBgQGEPniAQ4kSWBcuzMjhv/PkyRPi4uKY9udk7t29S2jog6wOP3NJl5PIadxbuLDj8EUePIzM1OtovH7zT164g417Tiu7spJI4sfvKgCgp6uN76i2BJy5wbduU6nb0YuL1x+wwacHerraAJib5mXOiP+xcnMQNdr9iWvn6cTFJ7BqaudMjT+j3b1zhyGD+rFwyYoUvx6FEBln0ZLlJCUlYWfzDfkM9Zgzeyatf26DhoYG2trarF77D1evXqGQuSmmxgbs3+9P/Ybfo9DI4X8apctJ5CSFLU2o6+TA0o1HlGmhj6PQ1dHG2FBfJa+ZqRFhj5NbYcIeR2FmqjrrySx/cstM2KOoVK/14FFyhenyjbe/euLiX3Hz7mOsLZLHx/z8fWUKW+Wn26i/OHHxNkfP3cR96FJsCpnStHbygNlff65F1POXDJuxiTPBdzl88jqdhi2jrlMJ5Rif7OD0qRM8DA+npnNlTAx1MDHU4dDB/fjOmYmJoQ4JCQlZHaLaKFCgAJqamoSHh6mkh4eFYWFhkUVRqRcpow8rWqwYO/f48/DJM67cuM3BI0HEx8djU7QoABUrViLo+CkePHzCjdv38dvyHxGPH2Nra5vFkWcyaaEROUn7Zs6ERzzjv4MXlGmnLt0mLv4VdZwclGn2RcwobJmfoLMhAASdDaGMnRUFTQyVeepVK0Hks5dcupF68/apS3eIiY3H3uZtk7iWlgaFrfJz+0Hy+Jg8ejokJiaRlJSkzJOYlERS0tsWnjd53pWQmNwdpaGmCz2l5ts69Qg8fobDQSeVW4WKlWn9y/84HHQSTc3UB1fnRjo6OlSoWIl9e/co0xITE9m3bw9VqzlnYWTqQ8ro0wwMDLC0tOTJkyfs3rWDJk2bqew3NjamYMGCXLt6lZMnjtOkafMsilSkR65ZWK927dqUL18eb2/vTLtGhw4dePr0KRs3bsy0a2QEhUKBW/NqrNwSpByfAhD1PIalGwOYPOBHIiKjeRYdg9eQVgSeucHRczcB2B1wiUs3Qlk03p1hMzZibmrEKI8mzFt7gLj4V6le71l0DAvXH2JE90bcDX3C7QcR9HNPHsC4YddJAPYEXmaiZwu8h7Zm7pr9aCgUDOxYn1cJCew/fgWA/w5eoHfbOgzt1pC120+QN48uY3o149b9x5y+fDcTSyxj5c2bl1Kly6ikGRgYkD+/aYp0AX08+9O1kzuVKlWmcpWqzPLx5kV0NG7uHbM6NLUhZZS6XTt3kJSURPHiDly/fo3ffxtMcYcSynLZsH4dBQoWxNq6MOfPn2PQAE+aNmuB63f1szjyTJZDF9bLNRWar2HGjBkqLQzqqq6TA4Ut87NsY2CKfYOn/kNiYhKrp3ZBV0eL3Ucu0XfS38r9iYlJtOw7lxm//4L/0gFEx8SycvNRxs7dqsxT2DI/wdvGUr/LDA6eSF6kaqj3v7xKSGTReDf0dbU5dv4W33fz4emz5AHIV26G0bLvPIb9+j3+ywaQmJjEmct3ae4xh9DXXVn7j12hw+/L6OfuSn/373gRE0fQ2RCaecwhJjY+M4tMZKFWrX/m0cOHjB0zkrDQUBzLlWfTlu2Ym5t/+uBcQsoodVGRkYwc8Tv37t7FJH9+WvzwI6PHTkBbO3lcXmjoA4YMHpDcPWdpyf/atmfosBFZHPVXkN5uIzXtclIkZYe/wBnga7TQZJWoqCiMjY3RLdsVhaZOVodDrcr2rJnWlVJNRikrLOoiPMAnq0PIFrSz4bo+Qn3lkj8z6RIVFYVFgXxERkZiZJT6jNGMuIaxsTG6rhNRaH35hISkVzHE7v49U2P9ErnqW+vVq1f06tULY2NjChQowIgRI5QftNjYWAYOHEihQoUwMDDAyckJf39/5bFLly4lX7587Nixg5IlS2JoaEjDhg158ODtQNcOHTrQokUL5etnz57Rtm1bZf/t9OnTqV27Np6enso8NjY2TJw4kU6dOpE3b14KFy7M/PnzM7soMlXDGqX5c9EOtavMCCGEAEjvDCf1rDqoZ1SZZNmyZWhpaXH06FFmzJiBl5cXCxcuBKBXr14EBASwZs0azp49S6tWrWjYsCFX33mux4sXL5g6dSorVqzgwIED3L59m4EDB37wev379+fw4cP4+fmxa9cuDh48yMmTJ1PkmzZtGpUrV+bUqVP07NmTHj16EBwcnMoZk8XGxhIVFaWyqZPfvTcyffmeT2cUQgjx9eXQWU65agyNtbU106dPR6FQ4ODgwLlz55g+fToNGjRgyZIl3L59GysrKwAGDhzI9u3bWbJkCRMnJi9+Fh8fj6+vL8WKFQOSK0Fjx45N9VrPnj1j2bJlrFq1inr16gGwZMkS5fnf1ahRI3r27AnAkCFDmD59Ovv27cPBwSFFXoBJkyYxZsyY9BWGEEIIkYPkqhaaatWqoXinZuns7MzVq1c5d+4cCQkJFC9eHENDQ+W2f/9+rl+/rsyfJ08eZWUGwNLS8oMPf7tx4wbx8fFUrVpVmWZsbJxqJcXR8e2DCRUKBRYWFh99qNzQoUOJjIxUbnfu3ElbAQghhBAKRToX1pMWGrX1/PlzNDU1OXHiRIo1QAwN36638mZk/BsKhSJDBruldt7ExA8/m0hXVxddXd10X1cIIUQulEOnbatnVJkkKChI5XVgYCD29vZUqFCBhIQEwsPDsbOzU9m+dKXNokWLoq2tzbFjx5RpkZGRXLlyJV33kJEM8+jy58CWBG8bS0SAF/uW9qdSqcLK/Wb58zJ/TDtu7JzA4yNebJrVk2KFC370nFpaGgzt1pALfqN4EjidoL9/4zuXkp91XQDP9vW4tWcSt/ZMom/7uir7qpQpwuGVg9HU/Ppv32l//sG31Z2wKmhM0cIWtGn1A1evfHi80/vWr12Dkb4mbVr9oJJupK+Z6jbDayqQPG6qayc3Cpnlo0LZEuzbu1vl+BleUxnYr0/6bzCD+c6ZjYOdDfkM9ajp4sSxo0c/mv+f9esoV6YE+Qz1qFy+LNv/26ayPykpibGjR2JrbYlJXn0aNXDl2jvj3GJjY+nk3h6z/EaULVWcvXtUy8lr2p/069s7424wg0g5pY3v3NmUsLfFJK8+tapX49ixD5fTiuVLyaOjobKZ5NX/YP7eHt3Jo6PBLB9vZVpsbCydO7hhbmqMYymHFOU0fdqf9PdUv3LKrXJVheb27dv079+f4OBgVq9ezcyZM+nbty/Fixenbdu2uLm5sWHDBkJCQjh69CiTJk1i69atnz5xKvLmzYu7uzuDBg1i3759XLhwgc6dO6OhoaHS7ZWV5o78H3WrlaDT8GVUbj2R3QGX2erbG6uCxgCsnd4N228K0MpzHtXa/MHtBxFs8+1NHr0PTw0f3bMpXVrWoP+UdVRoOZ6F6w/x97SulHP4Js3XLWNvxYgejXH7bQnuQ5cwqmcTStsljz3S1NTAZ9gv9JmwRmVRwK/l0MH9dOvegz37j7Bpyw7iX8XToklDoqOjP3nsrVs3GT50MC7Va6bYdzXknso2Z95CFAoFzX74EYAlixZw+tRJdvsfpmOnrnTu0E7ZOnjzZghLlyxk5JjxGXuz6bRu7d8MGdSfYcNHEXD0JI6O5WjWuMEHu1MDjhzBvV0b3Dt2JvDYKZo2b0Hrli24cP68Ms+0qVOYM8sHn9m+HDgchIGBAU0bNyAmJgaARQvmc+rUCfwPBtCpSzc6tP/f23IKCWHJogWMGTch82/+M0g5pc36tX/z26AB/D58JEeCTlDW0ZHmjRt+tHveyMiIG7fvK7fL126mmm/Txn85GhSE5XtjHBcvnM+pkyfYd+AInbp0paNb2/fKaSGjx6pXOaVJDh0UnKsqNG5ubrx8+ZKqVavi4eFB37596datG5A8YNfNzY0BAwbg4OBAixYtOHbsGIULF/7EWT/My8sLZ2dnmjRpgqurK9WrV6dkyZJq8UBCPV1tWtQrzzDvjRw+eZ0bdx4xYd42rt95SNdWNbErbIaToy19JqzhxMXbXL0VTp+Jf6Onq03r7yt98Lz/a1KVKYt2suPQRW7ee8yCdYfYcfiispXlU9cFcLAx5/zVe+w/dgX/o1c4f/U+Dq8fm9DP3ZXDJ69x4uLtzC+kVPzr9x9t23egZKnSlHUsh+/8Jdy5c5vTp0589LiEhAS6dGjP7yNGYZPKc2LMLSxUtq2b/aj1bR1sbZOfORMcfIlGjZtSslRpunbvyaOHD3n86BEA/fr0ZOz4SWq1HgSAj7cXHTt3xa1DR0qWKsXMOb7o58nDsqWpPx199qwZ1G/QkP4DBlGiZElGjRlH+QoV8Z0zC0hudZjt482Q34fTtFlzyjo6snDJch7cv4/fpo0ABF++ROMmzShVujTde3jw8OFDHr0upz69ejB+4mQpJ7JpOc2YTsfOXXBzf11Os5PLafkHygnejkl8s6W20OC9e/cY0K8PS5b9laL7//LlSzRu0pRSpUvz6/vl1Lsn4yb+oXbllCbycMrszd/fn9mzZzN37lwiIyOJiIhgwoQJytYSbW1txowZQ0hICHFxcdy/f58NGzZQtmxZ4O1jDd7VokULlTE0S5cuVXnsQd68eVm5ciXR0dE8ePCAbt26ERwcjJ2dnTLPzZs3VdalATh9+jSjR4/O0Pt/n5amBlpamsTEqa6wGxMbj0uFYujqJA+viol7+ziDpKQk4uJe4VK+GB+io62V4pwvY+JwqVAsTdcFOH/tPnZFzLC2MKGwpQl2Rcy4cP0+tt8UwK1ZNUbP3vLlN57BIqOSH7xpYpL/o/n+mDiOggUL4tbh008GDw8LY8f2bbR/Z9n6smUdCThymJcvX7Jn1w4sLCwxLVCAv1evRE9Xj6bNf/jIGb++uLg4Tp08Qd16rso0DQ0N6tZ15WhgQKrHBAUGUKeuq0rad/UbEPQ6/82QEEJDQ6n7Th5jY2OqVHVS5inrWI4jhw/x8uVLdu3cgYWlJQUKFGD1qpXo6unRvIWUE2Tfcnr3vt+UU1BgyhXP33j+/DkOdjbYFy1Mqx9bcPHCBZX9iYmJdOnoRr/+AylVunSK48s6luPI68/du+W0ZlXy507dyinNcmgLjQwKzkSnTp3i8uXLVK1alcjISOUU7+bNs/7BZ89fxBJ45gZDu35PcEgYYY+jaN2wMk6Otly/85Dgm6HcfhDBuN7N6DV+NdEv4+jTrg7fWJhgUcD4g+fdHXCJPu3qcujkNW7ceUSdqg40r1seTU1Fmq4LEBwSxqhZm9kytxcAI2f6ERwSxlbfXgzz3sh3LiUZ9msj4l8lMPDP9Rw+ef2D8WSmxMREfhvUj2rO1T/6DKaAw4dYsXQxh4NSrkGUmlV/Lccwb16atfhRmdbevRPnz5+jaoUy5DctwLK/1vDkyRMmjBvNth17GTt6BP+s+xvbokWZ47sIq0KF0n1/6fHo0SMSEhIwM1P9RWxmbk5w8OVUjwkLDcXsvV/QZmbmhIUlP/Q0NDRUeY73z/kmj3vHTpw/d5YKjqUwNS3AX6vW8uTJE8aNGcmO3f6MHjmcdWvXULRoMXwXLKaQlFO2Kqf3W1jMzMw+WE7FizvgO38RZco6EhUVibfXNOp+W53jp8/zzTfJXeDT/pyMlpYWPXulPv7MvUNyOVUsV/p1Of2dXE5jR7Fj1z5GjxzO+nV/U7RoMebOX5Tl5ZTbSYUmk02dOpXg4GB0dHSoVKkSBw8epECBAlkdFgCdhi9n3ui23Ng5gVevEjh9+Q5rtx+nQsnCvHqVyC8DFjB3VFseHPiTV68S2BsUzPZDFz5aOR/453rmjGjDmQ3JqzDfuPuI5X6BuDevlqbrvrFw/SEWrj+kfN22qRPPo2MJOhvCmY0jqNHuTwqZ5WPFH50o0XjUBx+MmZkGePbi0oUL7Nhz4IN5nj17RrfO7vjMmYdpGv+/r1i+hNY//0+la1JbWxsv71kq+Xp060T3nr05e+YUWzdv4sjRU3h7/cngAX35a836L7upbE5bWxvvmbNV0rp17khPjz6cOX2KzX4bOXriDF5TpzCgXx/WrP0niyLNWrmhnJyqOeP0ztPGqzm7UMGxFIsWzGPUmHGcPHmC2bN8OBJ04oPjGrW1tfH2ea+cunSip0dvTp8+xRa/TQQdP43X1CkM7NeX1Wuzyecuh85ykgpNJqpQoQInTnx8bEVWCrn7iPpdZpBHTwcjQz1CH0Wx4o+OhNxL7iM+dekO1X75AyNDPXS0tXj05DkHlg/86PiVR0+e07r/AnR1tDA1NuD+w0jG92lOyL3Hab7u+0zzGTCs2/d819mbKmVtuHYrnOu3H3L99kO0tDSwL2LGhWv3M7ZwPmGAZ2+2b9vKf7v9KfTNNx/MF3LjOrdu3eTnlm9b5d5MyTcx1OHE2UsULfq2C+/IoYNcvRLM0hWrP3r9A/v3ceniRWbNXcDwoYOp3+B7DAwM+LFlKxr6zv7osV9DgQIF0NTUJDw8TCU9PCzsgzMHzS0sCA97L394GObmyfnfHBceFoalpaXKOR3LlU/1nPv993Hx4gXmzl/I0CGDaNCwEQYGBrT8qbVyzElWknJKmzflFJbivsOV9/0p2tralCtXgRuv1xY7cuggD8PDcShWRJknISGB3wYPZNbMGVy+GpLiHPv993Hp4gXmzlvA778NokHD75XlNG/ut+m4w68shz6cUj2rWeKrehETR+ijKPLl1cfVpSRb/M+p7I96HsOjJ88pVrggFUsVZov/2U+eMzbuFfcfRqKlpUGLeuVTPeZT131jyoCWzFy5j3vhT9HUUKCl9XatIC1NTTQ1vt6HKykpiQGevdnit5HN23djY5NygO+7ijuUIPD4GQ4HnVRujRo3pda3dTgcdJJvvrFWyb982WIqVKxEWcdyHzxnTEwMAzx7M2PWXDQ1NUlISCA+PnlMUnx8PIkJCem/0XTS0dGhQsVK7Nv79hEYiYmJ7Nu3h6rv/Gp+l1M1Z/z3qT4yY8/uXcpf2Ta2tlhYWLDvnTxRUVEcOxqk8kv8jZiYGDz7eDBrzrxUyylBygnIXuX07n2/KSenatU+cuRbCQkJXDh/DgvL5ApQm7btOXriDIHHTik3Sysr+vUfiN+W7SmOj4mJoV+fXsyc7fu2nF6pVznldtJCk4u5OpdEoYArN8MpZl2Qif1acCUkjOV+yQMHf3StwMMnz7kTGkEZeyumDvqJzf5n2RP4ts964bj23A+PZORMPyB5jRgrs3ycCb5LIbN8DPu1ERoaCryW7k7zdd9V16kE9kXM6DJyBQAnLtzGwcac+tVL8Y25CQkJiVy59eFpmxmtv2cv1v+9mtXr/iWvYV7CXo9XMDI2Rl8/eY2Lbp3dsbIqxOhxE9HT00sxvsY4Xz6AFOlRUVFs3LCeCX/8+dEYpkwaT/0G31OufAUguSl9xO9DaOfWgfm+s3FydsmIW023Pp796drJnUqVKlO5SlVm+XjzIjoat9eDnTt3cMOqUCHGTZgEgEevvtSv9y3e06fx/feNWbd2DSdPHGf23OSHtSoUCjz6eDJ54njs7OyxsbFlzOgRWFpZ0ax5ixTXnzRhHA0aNqJ8heRycnapzu+/DcLNvSO+c2bh7FL96xTEJ0g5pU2fvv3o2rkDFSu+LqeZyeX0ZvB8l47uWFlZMfZ1OU0cP5aqTtUoVsyOp5FP8Z42ldu3b9GhYxcATE1NMTU1VbmGtrY25hYWFE9lRfdJE8bR4Pvv35aTc3V+HzqY9m4d8Z07i2pqUk5poVAo0rd8iJq20EiFJhczNtRjbO9mFDLPR0TkCzbtOc2o2Zt59Sq5S8SioBGTB/yImWleQh9FsXJLEJPmq/5ysbbIT2Li25leurrajPJogm2hAjx/EcuOwxfoPGI5kc9fpvm6b+jpajP9t1a0H7JYOZvsXvhT+k9Zx7zR7YiLf0XXkSuIiVWdMZWZFs33BaBRfdXF/ubOX0Tb9h0AuHvnDhoan9/4+c+6NSQlJfFT6zYfzHPxwnk2/LNOZYBxix9/4uDB/TR0/RY7ewcWLfvrs6+dGVq1/plHDx8ydsxIwkJDcSxXnk1btisHdt65c1ulnJxdXFi6YhVjRg1n1PDfsbO3Z+0/Gyld5m3Fb8DAwbyIjqZXj248ffoUl+o18NuyPcVSCBfOn+ef9WsJOn5amfZjy584uN8f1zo1sS/uwLIVqzK3ANJIyiltfmr9Mw8fPWTc2FHKctq45b8PltPTp0/w6NGNsNBQ8pmYUKFiJfbuP0zJUqU++9oXzid/7gKPnVKm/dDyJw4c8Oe7urWwL+7A0uUr03+TX0lOrdAokjJi7X6RpaKiojA2Nka3bFcUmh9e9E5AeIBPVoeQLWhrSW+0yDjyZ+bToqKisCiQj8jIyExb2+bN3wr9ZrNRaH941eRPSYp/yUs/j0yN9UtIC40QQgiRmyheb+k5Xg1JhUYIIYTIRXJql5O0KwshhBAi25MWGiGEECIXyaktNFKhEUIIIXIRqdAIIYQQItvLqRUaGUMjhBBCiGxPWmiEEEKI3ESmbQshhBAiu5MuJyGEEEIINSUtNEIIIUQuolCQzhaajIslI0mFRgghhMhFFKSzy0lNazTS5SSEEEKIbE9aaIQQQohcJKcOCpYKjRBCCJGb5NBp29LlJIQQQohsT1pohBBCiNwknV1OSdLlJIQQQoislt4xNOmbIZV5pEIjhBBC5CI5tUIjY2iEEEIIkWkSEhIYMWIEtra26OvrU6xYMcaNG0dSUpIyT1JSEiNHjsTS0hJ9fX1cXV25evXqZ11HKjRCCCFEbqLIgO0zTJ48mblz5zJr1iwuXbrE5MmTmTJlCjNnzlTmmTJlCj4+Pvj6+hIUFISBgQENGjQgJiYmzdeRLichhBAiF/naXU5HjhyhefPmNG7cGAAbGxtWr17N0aNHgeTWGW9vb4YPH07z5s0BWL58Oebm5mzcuJFffvklTdeRFhohhBBCfLaoqCiVLTY2NtV8Li4u7NmzhytXrgBw5swZDh06xPfffw9ASEgIoaGhuLq6Ko8xNjbGycmJgICANMcjLTQ5yG3/qRgZGWV1GGrNpMbgrA4hW3hyaEpWhyByEHUdRKpOvmYZZVQLjbW1tUr6qFGjGD16dIr8v/32G1FRUZQoUQJNTU0SEhKYMGECbdu2BSA0NBQAc3NzlePMzc2V+9JCKjRCCCFELpJRFZo7d+6o/IjW1dVNNf/atWtZuXIlq1atonTp0pw+fRpPT0+srKxwd3f/4jjeJxUaIYQQQnw2IyOjNPUKDBo0iN9++005FqZs2bLcunWLSZMm4e7ujoWFBQBhYWFYWloqjwsLC6N8+fJpjkfG0AghhBC5yJsWmvRsn+PFixdoaKhWNzQ1NUlMTATA1tYWCwsL9uzZo9wfFRVFUFAQzs7Oab6OtNAIIYQQuclXfjhl06ZNmTBhAoULF6Z06dKcOnUKLy8vOnXqlHw6hQJPT0/Gjx+Pvb09tra2jBgxAisrK1q0aJHm60iFRgghhBCZZubMmYwYMYKePXsSHh6OlZUVv/76KyNHjlTmGTx4MNHR0XTr1o2nT59So0YNtm/fjp6eXpqvo0h6d6k+kS1FRUVhbGxM2ONImeX0CTLLKW1klpMQX1dUVBTmpsZERmbe9/ibvxUWnf5CQyfPF58nMe4FoYvbZWqsX0JaaIQQQohcJKc+y0kqNEIIIUQuklMrNDLLSQghhBDZnrTQCCGEELnJV57l9LVIhUYIIYTIRaTLSQghhBBCTUkLjRBCCJGL5NQWGqnQCCGEELmIgnRWaNR0EI10OQkhhBAi25MWGiGEECIXkS4nIYQQQmR/OXTatnQ5CSGEECLbkxYaIYQQIheRLichhBBCZHtSoRFCCCFEtqdQJG/pOV4dyRgaIYQQQmR70kIjhBBC5CLJLTTp6XLKwGAykLTQiAw1fuxo9LUVKlu5MiWyOqyvrnp5W9ZP7cCNzcN5GTiFprVKq+yfP6I1LwOnqGybpndW7q9ZsWiK/W+2SiW/+dq3k+V858zGwc6GfIZ61HRx4tjRo1kdktqRMkobKSdA8bbb6Us2dZ22LS00IsOVKl2ardt3K19raeW+t5mBvg7nrj5g+eZj/D3ZPdU8OwIu8+u4tcrXsfEJyn8Hnr2FTaOxKvlH/tqAOpXtOHHpbuYErabWrf2bIYP6M3O2L1WqOjHLx5tmjRtw5kIwZmZmWR2eWpAyShspp5xNWmhEhtPS1MLCwkK5FShQIKtD+up2BgQzZt4O/PZf+GCeuLhXhEU8V25Pn71U7ot/laCy73HkC5rULM3yLce/Rvhqxcfbi46du+LWoSMlS5Vi5hxf9PPkYdnSxVkdmtqQMkobKadkb2Y5pWdTR1KhERnu2rWr2Ba2omTxonRo35bbt29ndUhqqWbFYtzaNpIzfw9ixuAfyG+U54N5m9QqhalxHlbksgpNXFwcp06eoG49V2WahoYGdeu6cjQwIAsjUx9SRmkj5fRWerqb0jtDKjNJhUZkqCpVnZi/aCl+W7bjM2suN2+G4FqnJs+ePcvq0NTKroBguoz9m0a95zN89jZqVijKpumd0NBI/ZvCvWlVdgVd4d7DyK8cadZ69OgRCQkJmJmZq6SbmZsTGhqaRVGpFymjtJFyyvly3+AGkakaNPxe+e+yjo5UqeqEQ7Ei/LNuLR06df7IkbnLut1nlP++cD2Uc9cecGnDb9SqWAz/49dU8hYqaMx3TsVpN/yvrx2mECIH0tBQfPDHU1okpePYzCQtNCJT5cuXDzv74ly/fu3TmXOxm/cjePjkOcW+MU2xr32TyjyOfMGWAxezILKsVaBAATQ1NQkPD1NJDw8Lw8LCIouiUi9SRmkj5fSWdDkJ8QWeP39OyI3rWFhYZnUoaq1QQWNMjfMQ+jhl15xbk8qs+u8ErxISsyCyrKWjo0OFipXYt3ePMi0xMZF9+/ZQtZpzFkamPqSM0kbKKefL0i6n2rVrU758eby9vbMyDJGBfhs8kMZNmlK4cBHu37/P+LGj0NTUpPUvbbI6tK/KQF9HpbXFxio/jvaWPIl6SUTUC4Z1/o6N+84RGvGMooVMmdCrEdfvPmZXYLDKeWpXtsO2kClL/HLhWhmv9fHsT9dO7lSqVJnKVaoyy8ebF9HRuLl3zOrQ1IaUUdpIOSWTZzllI0uXLsXT05OnT59+1nH+/v7UqVMnRfqwYcMYP358BkWXs927dxe3dm2IePyYAgUL4lK9BvsPBVKwYMGsDu2rqljyG3bO6a58PcWzKQArth6nz5QNlLGzoG2jSuTLq8eDR1HsDrrK2Pk7iHtnLRqADk2rEHD2JlduPfyq8auTVq1/5tHDh4wdM5Kw0FAcy5Vn05btmJubf/rgXELKKG2knJLl1Gc5ZasKTVxcHDo6Opl+neDgYIyMjJSvDQ0Nv+g8CQkJKBQKNDRyT8/eipVrsjoEtXDw5A30qw3+4P5mnovSdJ4Oo1ZnVEjZWg+PXvTw6JXVYag1KaO0kXLKuS00Wf6X9tWrV/Tq1QtjY2MKFCjAiBEjSEpKAsDGxoZx48bh5uaGkZER3bp1w9/fH4VCodL6cvr0aRQKBTdv3sTf35+OHTsSGRmp/J82evRoAGJjYxk4cCCFChXCwMAAJycn/P39U8RkZmamsjDcmwrNkydPcHNzw8TEhDx58vD9999z9epV5XFLly4lX758+Pn5UapUKXR1dbl9+zaxsbEMGTIEa2trdHV1sbOzY9Git3/Qzp8/z/fff4+hoSHm5ua0b9+eR48eZXxhCyGEEDlUlldoli1bhpaWFkePHmXGjBl4eXmxcOFC5f6pU6dSrlw5Tp06xYgRIz55PhcXF7y9vTEyMuLBgwc8ePCAgQMHAtCrVy8CAgJYs2YNZ8+epVWrVjRs2FClUvIxHTp04Pjx4/j5+REQEEBSUhKNGjUiPj5emefFixdMnjyZhQsXcuHCBczMzHBzc2P16tX4+Phw6dIl5s2bp6wkPX36lLp161KhQgWOHz/O9u3bCQsLo3Xr1h+MIzY2lqioKJVNCCGESIuculJwlnc5WVtbM336dBQKBQ4ODpw7d47p06fTtWtXAOrWrcuAAQOU+e/cufPR8+no6GBsbIxCoVCZinf79m2WLFnC7du3sbKyAmDgwIFs376dJUuWMHHiRGXeb75RffjfrVu3iIiIwM/Pj8OHD+Pi4gLAypUrsba2ZuPGjbRq1QqA+Ph45syZQ7ly5QC4cuUKa9euZdeuXbi6Jq9QWbRoUeW5Z82aRYUKFVSuv3jxYqytrbly5QrFixdPcY+TJk1izJgxHy0HIYQQIjUyhiaTVKtWTaW25+zszLRp00hISB4cWbly5Qy5zrlz50hISEhRQYiNjcXUVHXtj4MHD5I3b17laxMTEw4fPoyWlhZOTk7KdFNTUxwcHLh06ZIyTUdHB0dHR+Xr06dPo6mpybfffptqXGfOnGHfvn2pjtO5fv16qhWaoUOH0r9/f+XrqKgorK2tP3TrQgghRI6X5RWaTzEwMFB5/WaA7ZtxNoBKl8+HPH/+HE1NTU6cOIGmpqbKvvcrE7a2tuTLl++L4tXX11epoOnr638yrqZNmzJ58uQU+ywtU1+7RVdXF11d3S+KTwghRO6mIJ2DglHPJposH0MTFBSk8jowMBB7e/sUlY433kz/ffDggTLt9OnTKnl0dHSULTxvVKhQgYSEBMLDw7Gzs1PZ0rJKZMmSJXn16pVKvI8fPyY4OJhSpUp98LiyZcuSmJjI/v37U91fsWJFLly4gI2NTYq43q/MfQ2+c2bjYGdDPkM9aro4cezox9c/+Wf9OsqVKUE+Qz0qly/L9v+2qexPSkpi7OiR2FpbYpJXn0YNXLn2zpil2NhYOrm3xyy/EWVLFWfvnt0qx3tN+5N+fXtn3A1+AcM8uvzp2ZTgf4cS4T+BffN7Uqmkarekg40Z6/7sQOjuMTzaN55Di3tjbZ7vg+fU0tRgaCdXLqwfwpP9Ewha4cl31VRb46qXt2X91A7c2Dycl4FTaFqrdIrzeP6vFre2jeTWtpH0/V8tlX1VSltzeGkfNDWz7mMu76e0kXJKGymnjCErBWeS27dv079/f4KDg1m9ejUzZ86kb9++H8xvZ2eHtbU1o0eP5urVq2zdupVp06ap5LGxseH58+fs2bOHR48e8eLFC4oXL07btm1xc3Njw4YNhISEcPToUSZNmsTWrVs/Gae9vT3Nmzena9euHDp0iDNnztCuXTsKFSpE8+bNP3icjY0N7u7udOrUiY0bNxISEoK/vz9r164FwMPDg4iICNq0acOxY8e4fv06O3bsoGPHjikqZZlt3dq/GTKoP8OGjyLg6EkcHcvRrHEDwsPDU80fcOQI7u3a4N6xM4HHTtG0eQtat2zBhfPnlXmmTZ3CnFk++Mz25cDhIAwMDGjauAExMTEALFown1OnTuB/MIBOXbrRof3/lK1vN0NCWLJoAWPGTcj8m/+Iub//RN2q9nQas4bK7bzYffQqW2d2xapg8tR+20L52TOvB1duhdOg5zyqtPNi0pI9xMR9uOVwdPcGdGnhRP9pm6jQZhoL/w3k7z/cKVfcSpnHQF+Hc1cf4Dn131TPUcbOghHd6uM2YiXuI1cxqlsDShdLrpxramrgM/hH+kzeQEIWrTAs76e0kXJKGykn8SlZXqFxc3Pj5cuXVK1aFQ8PD/r27Uu3bt0+mF9bW5vVq1dz+fJlHB0dmTx5copF71xcXOjevTs///wzBQsWZMqUKQAsWbIENzc3BgwYgIODAy1atODYsWMULlw4TbEuWbKESpUq0aRJE5ydnUlKSmLbtm1oa2t/9Li5c+fy008/0bNnT0qUKEHXrl2Jjo4GwMrKisOHD5OQkED9+vUpW7Ysnp6e5MuX76uvX+Pj7UXHzl1x69CRkqVKMXOOL/p58rBs6eJU88+eNYP6DRrSf8AgSpQsyagx4yhfoSK+c2YByb9+Zvt4M+T34TRt1pyyjo4sXLKcB/fv47dpIwDBly/RuEkzSpUuTfceHjx8+FA5Zb1Prx6MnzhZZU2gr01PV4sWtcswbNY2Dp8O4cbdx0xYuIvrdx/T9cfk5dLHdG/IjiOXGTZrG2eu3CfkXgRbD17k4ZPoD573fw0rMWXZXnYEXObm/QgWbAhkR8BllVaWnQHBjJm3A7/9F1I9h0MRM85fe8D+E9fxP36N89cf4FAkuQWzX9tvOXw6hBOX7mZgaXweeT+ljZRT2kg5ZRyZ5ZQJ3l0DZu7cuSn237x5M9XjqlevztmzZ1XS3h1T8+Z8759TW1ubMWPGfHCGUO3atVOc510mJiYsX778g/s7dOhAhw4dUqTr6enh5eWFl5dXqsfZ29uzYcOGD573a4iLi+PUyRMMGjJUmaahoUHduq4cDQxI9ZigwAD69O2vkvZd/QZsfv1lcDMkhNDQUOrWdVXuNzY2pkpVJ4ICA2j98y+UdSzHqpUrePnyJbt27sDC0pICBQqwetVKdPX0aN7ih4y/2c+gpamJlpYmMXGvVNJjYuNxKWeDQqGgoUtJvP7yx8+7M+WKF+LWgwj+XLaPzQdSr4gA6OikPOfL1+dMq/PXQ7GzLoi1eT4UCrCzLsCFG2HYFsqPW5PKuHTw+ax7zUjyfkobKae0kXLKWDl1llOWt9AI9fDo0SMSEhIwM1NdAtzM3JzQ0NBUjwkLDcXsvSXDzczMCQtLzv/muBR5zN/mce/YCUfHclRwLMXkSRP4a9Vanjx5wrgxI/HynsnokcMpXcKOpo0acO/evQy518/x/EUsgWdvMrRTPSwLGKGhoeCXhhVwKlMEC1MjzEwMyGugy0C3OuwKvELTvgvw8z/Pmj/aU6NC0Q+ed3fgFfq0qUkx6wIoFArqVrWnee0yWJim/dde8M1wRvluZ4tPVzbP6MrIudsJvhnOrN9aMmzWNr5zKs7xlf0JWNaX6uVtM6I40kzeT2kj5ZQ2Uk4iLdR+lpPI2bS1tfGeOVslrVvnjvT06MOZ06fY7LeRoyfO4DV1CgP69WHN2n++eoydxqxh3rDW3NgynFevEjgdfI+1u05ToUQhZbfglgMXmLnmIABnrz7AydGGrj9U49CpG6mec+B0P+YMbcmZNQNJSkrixr0Ilm85jnuTKp8V28J/A1n4b6DyddtGlXgeHUvQ+Vuc+XsQNTrNpFBBY1aMa0uJHyeleFZUTpMd3k/qQMopbXJqOcmjD0SOVqBAATQ1NQkPD1NJDw8L++AsMHMLC8LD3ssfHoa5eXL+N8elyBP2Ns/79vvv4+LFC/Tw6MWB/f40aNgIAwMDWv7UmoP7/b/k1tIt5F4E9Xv6Ylp7GPbNJ1Kz8yy0tTQJuRfBo6fRxL9K4NJN1XsMvhmGtUW+D57z0dNoWg9Zjmmd4Tj8MIlyP/9J9MtYQu4//uI4TY3zMKyzK/2nbaJK6cJcu/2Q63ceceDkdbS0NLAv/PUeECrvp7SRckobKaeMJbOcRI6mo6NDhYqV2Ld3jzItMTGRffv2ULWac6rHOFVzxn/fHpW0Pbt34fQ6v42tLRYWFux7J09UVBTHjgYp87wrJiYGzz4ezJozD01NTRISEpRrDMXHx3/1WV/vexETT+jjZ+TLq4+rU3G2HLhI/KsETly8Q/H3Kgv21gW5/eDJJ88ZG/eK+w+j0NLUoEXtsmw5cPGL45vi2ZSZaw5y72EkmhoKtLTeLn2gpamBpsbX+xaS91PaSDmljZRTxsqpg4KlQiOU+nj2Z8miBfy1fBmXL12ij0cPXkRH4+beEYDOHdwYMeztoDyPXn3ZuWM73tOnEXz5MuPHjubkieN075n8JFuFQoFHH08mTxzPls1+nD93js4d3bC0sqJZ8xYprj9pwjgaNGxE+QoVAHB2qc6mjRs4d/YsvnNm4exSPdPLIDWuTsX5rlpxiliaULeqPdtn/8qVW+Es33IMgOkr9/OTazk6Nq9K0W9M6f6TC41qlGT+hreDFReO/JmxPRoqX1cpbU3z2mWwscpP9XI2+Hl3RkNDgddf/so8Bvo6ONpb4mifvMCijVV+HO0tU13fpm5Ve+wLF8R3ffI1T1y8i0MRM+o7O9CpuRMJiUlcuf0wE0rnw+T9lDZSTmkj5SQ+RcbQCKVWrX/m0cOHjB0zkrDQUBzLlWfTlu2Yvx40d+fObZWp5M4uLixdsYoxo4Yzavjv2Nnbs/afjZQuU0aZZ8DAwbyIjqZXj248ffoUl+o18NuyHT09PZVrXzh/nn/WryXo+Gll2o8tf+Lgfn9c69TEvrgDy1asytwC+ABjQz3G9vieQmbGRES9YNO+c4zy3cGr1+u7+O2/QO/JGxjkXpdp/Zpz5fZD2gxdwZEzN5XnsLbIR+I7M+h0dbQZ9WsDbK3y8/xlHDuOXKbzmL+JfB6jzFOx5DfsnNNd+XqKZ1MAVmw9Trdxa5XperpaTB/QgvbD/1LO0rv3MJL+XpuYN7w1cXGv6Dr2b2JiVWdVZTZ5P6WNlFPaSDlloPR2G6lnAw2KpI/NUxbZQlRUFMbGxoQ9jsyWayJ8TSY1Bmd1CNnCk0NTsjoEIXKVqKgozE2NiYzMvO/xN38rKo/ehpbel69E/yommuOjG2VqrF9CupyEEEIIke1Jl5MQQgiRi+TUhfWkQiOEEELkIrIOjRBCCCGEmpIWGiGEECIXkS4nIYQQQmR70uUkhBBCCKGmpIVGCCGEyEVyaguNVGiEEEKIXETG0AghhBAi28upLTQyhkYIIYQQ2Z600AghhBC5iHQ5CSGEECLbky4nIYQQQgg1JS00QgghRC6iIJ1dThkWScaSCo0QQgiRi2goFGiko0aTnmMzk3Q5CSGEECLbkxYaIYQQIheRWU5CCCGEyPZklpMQQgghsj0NRfq3z3Xv3j3atWuHqakp+vr6lC1bluPHjyv3JyUlMXLkSCwtLdHX18fV1ZWrV69+3n19flhCCCGEEGnz5MkTqlevjra2Nv/99x8XL15k2rRpmJiYKPNMmTIFHx8ffH19CQoKwsDAgAYNGhATE5Pm60iXkxBCCJGbKNLZbfSZh06ePBlra2uWLFmiTLO1tVX+OykpCW9vb4YPH07z5s0BWL58Oebm5mzcuJFffvklTdeRFhohhBAiF3kzKDg9G0BUVJTKFhsbm+r1/Pz8qFy5Mq1atcLMzIwKFSqwYMEC5f6QkBBCQ0NxdXVVphkbG+Pk5ERAQECa70taaESuEnFwclaHkC2YVOmV1SFkC0+OzcrqEITIMtbW1iqvR40axejRo1Pku3HjBnPnzqV///78/vvvHDt2jD59+qCjo4O7uzuhoaEAmJubqxxnbm6u3JcWUqERQgghchHF6//SczzAnTt3MDIyUqbr6uqmmj8xMZHKlSszceJEACpUqMD58+fx9fXF3d39i+N4n3Q5CSGEELlIRs1yMjIyUtk+VKGxtLSkVKlSKmklS5bk9u3bAFhYWAAQFhamkicsLEy5L033leacQgghhBCfqXr16gQHB6ukXblyhSJFigDJA4QtLCzYs2ePcn9UVBRBQUE4Ozun+TrS5SSEEELkIl97Yb1+/frh4uLCxIkTad26NUePHmX+/PnMnz9feT5PT0/Gjx+Pvb09tra2jBgxAisrK1q0aJHm60iFRgghhMhFvvajD6pUqcK///7L0KFDGTt2LLa2tnh7e9O2bVtlnsGDBxMdHU23bt14+vQpNWrUYPv27ejp6aX5Ommq0Pj5+aX5hM2aNUtzXiGEEELkfE2aNKFJkyYf3K9QKBg7dixjx4794mukqUKT1iYfhUJBQkLCFwcjhBBCiMyloVCgkY4mmvQcm5nSVKFJTEzM7DiEEEII8RXI07ZTERMT81n9W0IIIYTIWvK07dcSEhIYN24chQoVwtDQkBs3bgAwYsQIFi1alOEBCiGEEEJ8ymdXaCZMmMDSpUuZMmUKOjo6yvQyZcqwcOHCDA1OCCGEEBkro57lpG4+u0KzfPly5s+fT9u2bdHU1FSmlytXjsuXL2docEIIIYTIWG8GBadnU0efXaG5d+8ednZ2KdITExOJj4/PkKCEEEIIIT7HZ1doSpUqxcGDB1Okr1+/ngoVKmRIUEIIIYTIHIoM2NTRZ89yGjlyJO7u7ty7d4/ExEQ2bNhAcHAwy5cvZ8uWLZkRoxBCCCEyiMxyeq158+Zs3ryZ3bt3Y2BgwMiRI7l06RKbN2/mu+++y4wYhRBCCCE+6ovWoalZsya7du3K6FiEEEIIkck0FMlbeo5XR1+8sN7x48e5dOkSkDyuplKlShkWlBBCCCEyR07tcvrsCs3du3dp06YNhw8fJl++fAA8ffoUFxcX1qxZwzfffJPRMQohhBBCfNRnj6Hp0qUL8fHxXLp0iYiICCIiIrh06RKJiYl06dIlM2IUQgghRAbKaYvqwRe00Ozfv58jR47g4OCgTHNwcGDmzJnUrFkzQ4MTQgghRMaSLqfXrK2tU11ALyEhASsrqwwJSgghhBCZI6cOCv7sLqc///yT3r17c/z4cWXa8ePH6du3L1OnTs3Q4IQQQggh0iJNFRoTExPy589P/vz56dixI6dPn8bJyQldXV10dXVxcnLi5MmTdOrUKbPjFWruz8mTqF6tCgVN8lLYyoxWLVtwJTg4q8NSO4cOHqBli2YULVKIPDoa+G3amNUhfZHqFYux3vtXbuycwMtTs2ha21G5T0tLg/F9mnNs7e88OjKNGzsnsHBceywLGquc4/LWMbw8NUtlG9jx42tadfqxOjsW9CXs4J+8PDULY0P9VPM1rFGaA8sHEhHgxf39U1jr1VVlv7WFCRt8uvP4iBe39kxiomcLNDU/+3eeWvCdMxsHOxvyGepR08WJY0ePZnVIaif5c9cU28JW6Gsrsu3nLr3edDmlZ1NHaepy8vb2zuQwRE5x8MB+uvfwoFLlKrx69YpRI36nSaP6nDp7EQMDg6wOT21ER0dT1tERtw4dadO6ZVaH88UM9HU5d+UeyzcF8LdXN5V9efR0KF/Smj8W/MfZK/cwMcrD1EE/sc77V2q0naKSd8ycLSzZcFj5+ll07Eevm0dPm11HLrLryEXG9Wmeap4W9coze0QbRs3ajP/RK2hpaVC6mKVyv4aGgg0+PQh7HEWdDtOwKGjMwnHtiX+VwKhZmz+3KLLUurV/M2RQf2bO9qVKVSdm+XjTrHEDzlwIxszMLKvDUxvJn7tyuHXoxC+tfszqcLJMeh9foJ7VmTRWaNzd3TM7DpFD+G3drvJ6/qKlFLYy49TJE9SoWSuLolI/DRp+T4OG32d1GOm28/BFdh6+mOq+qOcxNOkxSyWt3x9rObRyMNYWJtwJfaJMfx4dQ9jjZ2m+7qxV/gDUrGSf6n5NTQ2mDmrJ794bWbYxQJl++Uao8t+uziUpWdSCxt1nEh7xjLNX7jF2zlbG92nOeN9txL9KSHM8Wc3H24uOnbvi1qEjADPn+PLff1tZtnQxgwb/lsXRqY+c8rkTqUtX22pMTAxRUVEqmxDvioqMBMDEJH8WRyLUgVFefRITE3n67KVK+oCO9bm7bzIBq4fQz61eurt9KpSwppC5CYmJSQSsHsKNnRPYOKsHpd5poXFytOX8tfuER7ytSO06cgnjvPoq+dRdXFwcp06eoG49V2WahoYGdeu6cjQw4CNHitxKQ6FI96aOPnuWU3R0NEOGDGHt2rU8fvw4xf6EhOzzq0ZkrsTERAYN8MTZpTqly5TJ6nBEFtPV0WJ8n+as3X6CZ9ExyvQ5q/dz6tIdnkRFU61cUcb2boZFQWOGTNvwxdey/aYAAMO7N2LItA3cuv+Yvu3rsWNBXxxbjOVJ1AvMTY0If69VKDwi+UeZeQEjyCZDvx49ekRCQgJmZuYq6Wbm5gQHX86iqIQ6S+96Mmpan/n8FprBgwezd+9e5s6di66uLgsXLmTMmDFYWVmxfPnyzIhRZFOevT24cOE8y1euyepQRBbT0tLgrymdUSgU9Jn4t8o+n7/2cvDEVc5fvc/C9Yf4zWsDPX7+Fh3tL34yi/IX5OSFO9i45zSnLt2h26i/SCKJH7+rkK57EUKop8+u0GzevJk5c+bQsmVLtLS0qFmzJsOHD2fixImsXLkyM2IU2ZBnn15s27aFHbv2yeMwcjktLQ1WTu5MYUsTmvSYpdI6k5pj526ira1JEasv76Z88Ci5q/PyjQfKtLj4V9y8+xhri+Tzhj2Owsw0r8pxZvmNkvc9yj7d5wUKFEBTU5Pw8DCV9PCwMCwsLLIoKqHOcuosp8+u0ERERFC0aFEAjIyMiIiIAKBGjRocOHAgY6MT2U5SUhKefXrht+lftu/ci42tbVaHJLLQm8pMscIFadx9FhGR0Z88ppzDNyQkJPIwIu2DhN936tIdYmLjsbd52w2jpaVBYav83H6Q/J0VdDaEMnZWFDQxVOapV60Ekc9ecumdwcPqTkdHhwoVK7Fv7x5lWmJiIvv27aFqNecsjEyoq/Q89kCdH3/w2W26RYsWJSQkhMKFC1OiRAnWrl1L1apV2bx5s/JhlSJZ7dq1KV++fK6a9u7Z24O/16xi3YZNGObNS2ho8h8GY2Nj9PVTXyskN3r+/DnXr11Tvr51M4Qzp0+TP39+rAsXzsLIPo+Bvg7FrAsqX9sUMsWxeCGeRL3gwaNIVv3ZhQolrPmxry+aGgrMX7eIRES+IP5VAk6OtlQpU4T9x6/yLDqGao62TB7YktXbjqUYOPwuc9O8mJsaUaxw8liZMvZWPIuO4U7oE55EveBZdAwL1x9iRPdG3A19wu0HEfRzTx40u2HXSQB2B1zi0o1QFo13Z9iMjZibGjHKownz1h4gLv5VZhVZpujj2Z+undypVKkylatUZZaPNy+io3Fz75jVoamV9z93N0OSP3cm+fNTOBt97kTqFElJSUmfc8D06dPR1NSkT58+7N69m6ZNm5KUlER8fDxeXl707ds3s2LNdr5WhSYqKgpjY2PCHkdiZGSUqdf6FH3t1Kvu8xcuob17h68bTCo+8+2eaQ7s96fhd3VTpLdr7878RUuyICJV+av2TlO+mpXs2bkw5Wd+hV8g4323EbxtbKrH1e8yg4MnrlK+xDfMGPozxW3N0dXW4ub9x6zaegyfFXtVKhUvT82i68gV/LU5CIBhvzZiePdGKc77bh4tLQ3G9W5Om8ZV0NfV5tj5Wwz6c71K60thSxNm/P4LtSrZEx0Ty8rNRxnus4mEhMQ03f+TY7M+nekrmTt7FtO9/iQsNBTHcuWZNt2Hqk5OWR2WWjmw358GrnVSpLdr786CxUu/fkDviIqKwtzUmMjIzPsef/O3otPyIHTyGH76gA+Ie/GcxW5OmRrrl/jsCs37bt26xYkTJ7Czs8PR0fHTB+QiubFCo+7UpUKj7tJaofkailiZcm7jSCr8NJ7rtx9mdTgq1KlCI7K3r1mh6bwi/RWaRe3Vr0KT7jW+ixQpwo8//pjrKzPR0dG4ublhaGiIpaUl06ZNU9n/5MkT3NzcMDExIU+ePHz//fdcvXpVuf/WrVs0bdoUExMTDAwMKF26NNu2bfvatyGE2mlYozSLNhxWu8qMENlVTh0UnKYxND4+Pmk+YZ8+fb44mOxs0KBB7N+/n02bNmFmZsbvv//OyZMnKV++PAAdOnTg6tWr+Pn5YWRkxJAhQ2jUqBEXL15EW1sbDw8P4uLiOHDgAAYGBly8eBFDw9Rr0LGxscTGvl0aXhY0FDnZvLUy2UAI8WlpqtBMnz49TSdTKBS5skLz/PlzFi1axF9//UW9evUAWLZsmXK68puKzOHDh3FxcQFg5cqVWFtbs3HjRlq1asXt27dp2bIlZcuWBVDOJEvNpEmTGDNmTCbflRBCiJxIg/R1z6jr41vTVKEJCQnJ7DiytevXrxMXF4fTOwPw8ufPj4ODAwCXLl1CS0tLZb+pqSkODg5cunQJSG7Z6tGjBzt37sTV1ZWWLVt+sBtv6NCh9O/fX/k6KioKa2vrzLg1IYQQOUx6u43UtctJXStauU6XLl24ceMG7du359y5c1SuXJmZM2emmldXVxcjIyOVTQghhMjNpEKTAYoVK4a2tjZBQUHKtCdPnnDlyhUASpYsyatXr1T2P378mODgYEqVKqVMs7a2pnv37mzYsIEBAwawYMGCr3cTr/nOmY2DnQ35DPWo6eLEsaNHP5r/n/XrKFemBPkM9ahcvizb/1MdyJyUlMTY0SOxtbbEJK8+jRq4cu2dwdCxsbF0cm+PWX4jypYqzt49u1WO95r2J/36qs+Mmzd8586mhL0tJnn1qVW9GseOfbycnj59imcfD2wLW5HPUA/HUg4qZfXn5EnUcK6KWX4jihQyp3XLH7gSrPowoSGD+lPI3BT7ooVZs0p1Ve4N69fRskWzjLvBT6hesRjrvX/lxs4JvDw1i6a1U7YmjujRmBs7JxAR4MVW314UK1xQZb+JUR6WTHAn7OCfPDgwhbmj/oeBvs5Hr6uro8X031pzd99kHh6exuqpXTDLr7rar7WFCRt8uvP4iBe39kxiomcLlYddlnP4hoDVQ3h4eBrrvX/FxCiPcp+mpgaHVw6mcukiX1IsX0w+d2mT0eW08d8NNPm+PoXMTdHXVnDm9OkU5xg8sD9WZvmxs7Vm9Xufu3/Wr6Nli6bpvq+vTaEAjXRsatpAIxWajGBoaEjnzp0ZNGgQe/fu5fz583To0AENjeTitbe3p3nz5nTt2pVDhw5x5swZ2rVrR6FChWjevDkAnp6e7Nixg5CQEE6ePMm+ffsoWbLkV72PdWv/Zsig/gwbPoqAoydxdCxHs8YNCA8PTzV/wJEjuLdrg3vHzgQeO0XT5i1o3bIFF86fV+aZNnUKc2b54DPblwOHgzAwMKBp4wbExCQvf79owXxOnTqB/8EAOnXpRof2/1NOrb4ZEsKSRQsYM25C5t/8Z1i/9m9+GzSA34eP5EjQCco6OtK8ccMPllNcXBxNvq/PrVu3WLVmHWfOX2a273ysrAop8xw8eIBfe/TE/2AAm7ftJP5VPE0bNyA6Onll3a1bNvP3mtX4bdvBhImT6dm9K48ePQIgMjKS0SOH4+3z9aYQG+jrcu7KPTwn/Z3q/gEdXOnZ5lv6TFxDLbepRL+MY/NsD3R13vZyL5noTsliljTpMYuWfXypUdGO2SP+99HrThnYksa1ytB28CLqd/HGsqAxa6Z1Ue7X0FCwwacHOtpa1Okwja4jV9CumRMjezRW5pkz8n/sP3YF5zaTMc6rz+DODZT7PNvXJfDMDY5fuPWlRfPZ5HOXNplRTi+io3GpXoPxEyeneo6tWzazds0qNm/byYRJU+j5a5f3PnfDmO4zO+NvNpOlpzLzZlNH6V6HRiR7/vw5PXr0YMOGDeTNm5cBAwawdetW5To0T548oW/fvvj5+REXF0etWrWYOXMm9vb2APTu3Zv//vuPu3fvYmRkRMOGDZk+fTqmpqafvHZGrUNT08WJSpWrKP8wJiYmYmdrTQ+P3gwa/FuK/O3+9zMvoqPZsGmLMq1W9WqUK1eemXN8SUpKomhhK/r0G0C//gOB5C+BIoXMmb9oKa1//oW+vXqS18iI8RP/4OXLl+Q3ysPt++EULFiQZo0b0rnrrzRv8cMX39P7MuLtXqt6NSpVrsz0GW/Lyb5oYXr07MXAVMppwXxfvL2mcvrcJbS1tdN0jYcPH1KkkDk79/hTo2YtvKZO4fSpUyxfuRoAm28sWL9xM5UrV6FXz19xcChB77790n1vb3zOOjQvT82idb/5bPY/q0y7sXMCPiv24r0ieTl+I0M9bu2eRLdRf7FuxwkcbM05vWEE1dtO4eTF2wB851KSjTN7YNdwBA8eRqa4jpGhHnf2/kGH35fy7+7TABS3MefMvyP41m0qR8/dpH71UmyY0Z2i9YcR/vrRCV1+qsH4Ps2xrvsb8a8SeHzEC+f/TebKzTC6tqrB9zXL8GMfX2wKmeI32wOX/03m+YvYFNdPTUasQ5MbPncZIaPL6V23bt6khL0tgcdOUe71zFRIrhiePnWSFa8fsFukkDn/bNxC5SpV6NXjV4o7lKCPZ8Z87r7mOjQ9Vx9DNx3r0MS+eM6cNlVy3jo0IpmhoSErVqwgOjqa0NBQBg0ahL+/v3JRPRMTE5YvX87Tp0958eIF27dvV1ZmAGbOnMm1a9eIiYkhPDyc5cuXp6kyk1Hi4uI4dfIEdeu5KtM0NDSoW9eVo4EBqR4TFBhAnbquKmnf1W9A0Ov8N0NCCA0Npe47eYyNjalS1UmZp6xjOY4cPsTLly/ZtXMHFpaWFChQgNWrVqKrp6d2X6pvyund+35TTkGBgakes3XLZpycnPHs44HNNxZULl+WKX9MJCEh4YPXiYpM/oNuYpL8IMWyjuU4efI4T5484eTJE7x8+ZJixew4cvgQp0+domcv9ZldaFPIFMuCxuwNuqxMi3oew7HzN3FytAHAydGWJ1EvlJUZgL1BwSQmJlGlTOrdPRVKFkZHW4u9gW+74q7cDOP2gwicHG2V5z1/7b6yMgOw68gljPPqU6qYJQDnrt6jXrUSaGpqUKeqA+ev3gdg5rBfGOa9Mc2VmYwgn7u0yYxySgtHx3KcPPH6c3fi9efOzo7Dhw5x6tRJPHqrz+fuc+TUdWi+qEJz8OBB2rVrh7OzM/fu3QNgxYoVHDp0KEODE1/Po0ePSEhIwMzMXCXdzNxc+Tym94WFhmJm/l5+M3PCwpLzvzkuRR7zt3ncO3bC0bEcFRxLMXnSBP5atZYnT54wbsxIvLxnMnrkcEqXsKNpowbK91pWelNO5inu20x5T++7eeMG/25YT0JCAhv8tvLb78Px8fbij4njU82fmJjIoIH9cHapTukyZYDkL+Jf2rSlpktVfu3ckfmLlmJgYEDfXj3xmT2X+fPmUq50Cep+W4OLFy5k7E1/JosCyb/Ywt97uGT442eYmybvMzc1SvHwyYSERCKiXmBeIPVffBamRsTGxRP5XPUZT+GPo1TOG/74vetGJK/T9Oa8Pcas5AfX8lzcPJq4+AT+XLyTNo2r8DImjhMXbuE324Pzm0YxqmeTL7n9zyKfu7TJjHJKi+/qN6DN/9pRw7kK3Tp3YMHiZa8/dz2YOduX+b5zcSztQJ1a1bP8c/c5cmqX02c/nPKff/6hffv2tG3bllOnTikXeIuMjGTixImyuq34LNra2njPVO2D7ta5Iz09+nDm9Ck2+23k6IkzeE2dwoB+fViz9p8sivTLJSYmUtDMjNlz56OpqUnFipW4f/8e072mMmzEqBT5Pft4cPHCeXbvO6iSPnzkaIaPHK18PWHcGOrUq4e2ljaTJ03g2Mmz/LdtC106uXMk6Hhm31a2delGKPW7zFC+zm9swIjujfmuszdeQ1oReOYGvwxYwKGVgzh2/ibbDpz/yNmyp9zwucsoqX/uXNHW1mbypPEcO3WO/7ZuoUtHN44cPZF1gYrPb6EZP348vr6+LFiwQGU8QPXq1Tl58mSGBie+ngIFCqCpqUl4eJhKenhYGBYWFqkeY25hQXjYe/nDwzA3T87/5rgUecLe5nnffv99XLx4gR4evZIfJNewEQYGBrT8qTUH9/t/ya1lqDflFJbivsM/eE8WlpbY2xdHU1NTmeZQoiRhoaHExcWp5O3Xtxf/bdvK9p17lQszpib48mXWrF7JyNHjOHjAnxo1alGwYEFa/tSa06dO8uzZsw8em9lCHyW3iLw/+8jMNC9hj5P3hT2OouB7+zU1NchvlIewR6mvfB36OApdHW2MDVWf2m5maqRyXjPT966bP7ll5kPnnTzgR2at2se98KfUrGzPht2neBETx/aDF6hV2T7VYzKKfO7SJjPK6UsEX77M6lV/MWrMOA7s96d6zdefu1atOZXFn7vPoVCkf1NHn12hCQ4OplatWinSjY2Nefr0aUbEJLKAjo4OFSpWYt/ePcq0xMRE9u3bQ9Vqzqke41TNGf99e1TS9uzehdPr/Da2tlhYWLDvnTxRUVEcOxqkzPOumJgYPPt4MGvOPDQ1NUlISCA+Ph6A+Pj4j445+VrelNO79/2mnJyqVUv1mGrOLly/fo3ExLdPcL529QoWlpbo6CRPU05KSqJf3174bdrIfzv2YGNr+8EYkpKS6O3RnT+mTMPQ0DBFOQFZWlY37z3mwcNI6jg5KNPyGuhRpYwNQWdvAhB0NgQTozxUKPl2QcjaVYqjoaHg2PnUZxidunSbuPhXKue1L2JGYcv8BJ0NUZ63jJ0VBU3eDnisV60Ekc9eqjxlW3nNqsUpYWvO3DXJj1fQ1NBAWyu54qmtpYmmRuYOM5TPXdpkRjl9rqSkJHr1/JXJf3qp5efuc2goFOne1NFnf1otLCy4du1aivRDhw59dLl+of76ePZnyaIF/LV8GZcvXaKPRw9eREfj5t4RgM4d3BgxbKgyv0evvuzcsR3v6dMIvnyZ8WNHc/LEcbr37AUkDzzz6OPJ5Inj2bLZj/PnztG5oxuWVlY0a94ixfUnTRhHg4aNKF+hAgDOLtXZtHED586exXfOLJxdqmd6GaRFn779WLJo4dty6pVcTu1fl1OXju6MfKecuv3agycREQzs35erV67w37at/Dl5Er9276nM49nHgzWrVrJ0+UoM8+YlNDSU0NBQXr58meL6SxYvpECBgjRukrz+RTWX6uz338vRoEBmzphOyZKlyJcvX6aWgYG+Do7FC+FYPHnquU0hUxyLF8LawgSA2av2MaRLQxp/W5bSdlYsGteeBw8j8dt3BoDgkDB2HL7A7BH/o3LpIjiXK8r031qzbsdJ5Qwnq4LGnN4wXLkmTNTzGJZuDGDygB+pVdmeCiWtmT+mHYFnbnD03E0Adgdc4tKNUBaNd6ds8UK4OpdklEcT5q09QFz8K5V70NXRYvqQ1niMW62c/RZw5ga/tq5F2eKFaFGvPAGnb2RqOYJ87tIqo8sJICIigjOnT3Pp0kUArlwJ5szp06mOy1myaCEFCr793Dm7VGf/vr0EBb7+3JXK/M9dRtHIgE0dffYYmq5du9K3b18WL16MQqHg/v37BAQEMHDgQEaMGJEZMYqvpFXrn3n08CFjx4wkLDQUx3Ll2bRlu3IA7J07t5Vr6wA4u7iwdMUqxowazqjhv2Nnb8/afzYqB7ICDBg4mBfR0fTq0Y2nT5/iUr0Gflu2o6enp3LtC+fP88/6tQQdP61M+7HlTxzc749rnZrYF3dg2YpVmVsAafRT6595+Ogh48aOUpbTxi3/fbCcvrG2xm/rdgYP7E/VSuWwKlSInr36MGDQEGWeBfOSp5E2cK2jcq15CxfT3q2D8nVYWBhT/pjI3v2HlWlVqlSlj2d/fmzehIIFzZi/eGkm3LWqiqWKsHNhX+XrKQNbArDCL5Buo/5i2tLd5NHXZdbwNuTLq8+R09dp5jGH2Li3lYqOvy9j+m+t2TavN4mJSWzcc5oBU9Yp92tpaeJga4G+3tvF9gZP/YfExCRWT+2Cro4Wu49cou87a+EkJibRsu9cZvz+C/5LBxAdE8vKzUcZO3drinsY9msjth+6wNkrbwe9DpiyjmUTO7BroSdr/jvGv3tOZ0h5fYx87tImM8pp62Y/unXpqHzt1vYXAIaNGKUybiYsLIzJf0xg34EjyrQqVavSt98AfmzemIJmZixYtCyzbl2k0WevQ5OUlMTEiROZNGkSL168AJKX4h84cCDjxo3LlCDFx2XUOjS5gSy7lDafsw5NbpYR69AIAV93HZoB60+kex2aaT9VUrt1aD67hUahUDBs2DAGDRrEtWvXeP78OaVKlcLQ8MsLRwghhBBfhwbpGwejgXqOofnsCs0bOjo6Ks8hEkIIIYTIKp9doalTp85HVwncu3dvugISQgghROZJ79RrNZ3k9PkVmvLvPOcCkqernT59mvPnz+Pu7p5RcQkhhBAiE6R3td8cs1Lw9OnTU00fPXo0z58/T3dAQgghhBCfK8Omk7dr147Fixdn1OmEEEIIkQkUivQtrpdjupw+JCAgIMUaB0IIIYRQLzKG5rUff/xR5XVSUhIPHjzg+PHjsrCeEEIIIbLEZ1dojI2NVV5raGjg4ODA2LFjqV+/foYFJoQQQoiMJ4OCSX7wVseOHSlbtiwmJiaZFZMQQgghMoni9X/pOV4dfdagYE1NTerXry9P1RZCCCGyqTctNOnZ1NFnz3IqU6YMN25k/hNohRBCCCHS6rMrNOPHj2fgwIFs2bKFBw8eEBUVpbIJIYQQQn3l1BaaNI+hGTt2LAMGDKBRo0YANGvWTOURCElJSSgUChISEjI+SiGEEEJkCIVC8dFHGKXleHWU5grNmDFj6N69O/v27cvMeIQQQgghPluaKzRJSUkAfPvtt5kWjBBCCCEyl0zbRn2bmYQQQgiRNrJSMFC8ePFPVmoiIiLSFZAQQgghxOf6rArNmDFjUqwULIQQQojs481DJtNzvDr6rArNL7/8gpmZWWbFIoQQQohMltVjaP744w+GDh1K37598fb2BiAmJoYBAwawZs0aYmNjadCgAXPmzMHc3DztcaU1o4yfEUIIIUR6HDt2jHnz5uHo6KiS3q9fPzZv3sy6devYv38/9+/fT/Ew7E9Jc4XmzSwnIYQQQmRjircDg79k+9JHOT1//py2bduyYMECledBRkZGsmjRIry8vKhbty6VKlViyZIlHDlyhMDAwDSfP80VmsTEROluEkIIIbI5DRTp3oAUTwqIjY396HU9PDxo3Lgxrq6uKuknTpwgPj5eJb1EiRIULlyYgICANN/XZ42hESK7k67TtHlybFZWh5AtmNT8LatDyBaeHPwjq0MQ78ioadvW1tYq6aNGjWL06NGpHrNmzRpOnjzJsWPHUuwLDQ1FR0eHfPnyqaSbm5sTGhqa5rikQiOEEEKIz3bnzh2MjIyUr3V1dT+Yr2/fvuzatQs9Pb1Mi+ezH04phBBCiOwrox5OaWRkpLJ9qEJz4sQJwsPDqVixIlpaWmhpabF//358fHzQ0tLC3NycuLg4nj59qnJcWFgYFhYWab4vaaERQgghcpGvvQ5NvXr1OHfunEpax44dKVGiBEOGDMHa2hptbW327NlDy5YtAQgODub27ds4Ozun+TpSoRFCCCFEpsmbNy9lypRRSTMwMMDU1FSZ3rlzZ/r370/+/PkxMjKid+/eODs7U61atTRfRyo0QgghRC6ijs9ymj59OhoaGrRs2VJlYb3PIRUaIYQQIhfRIJ1dTl+6EM07/P39VV7r6ekxe/ZsZs+e/cXnlEHBQgghhMj2pIVGCCGEyEXUscspI0iFRgghhMhFNEhf94y6du2oa1xCCCGEEGkmLTRCCCFELqJQKNL1GBh1fYSMVGiEEEKIXCQdD8xWHq+OpEIjhBBC5CJfe6Xgr0XG0AghhBAi25MWGiGEECKXUc82lvSRCo0QQgiRi+TUdWiky0kIIYQQ2Z600AghhBC5iEzbFkIIIUS2JysFCyGEEEKoKWmhEUIIIXIR6XISQgghRLaXU1cKli4nIYQQQmR7UqERGerQwQO0bNEU28JW6Gsr8Nu0MatDUmu+c2bjYGdDPkM9aro4cezo0awOSS3l5nLq+oMTR1f0JWz3aMJ2j8Z/fg/qVysOgImRPl79m3FmzQAi/Mdx5d/fmNavKUYGuirneBnwR4qtlatjVtzOV/Wp76OkpCTGjh6JrbUlJnn1adTAlWtXr2ZNsF/Rmy6n9GzqSCo0IkNFR0dT1rEc3j6zszoUtbdu7d8MGdSfYcNHEXD0JI6O5WjWuAHh4eFZHZpaye3ldO9hFCPmbMelw0yqd5yF/4nrrJviRklbMywLGGFZwIihs7ZRqe10uo5fx3fViuP7+08pztN13DpsGo9Xbn4HLmbB3Xxdn/o+mjZ1CnNm+eAz25cDh4MwMDCgaeMGxMTEfOVIvy6NDNjUkSIpKSkpq4MQ6RMVFYWxsTFhjyMxMjLK6nCU9LUV/L3+X5o1b5HVoailmi5OVKpcBW+fWQAkJiZiZ2tND4/eDBr8WxZHpz7UuZxMambN9e/tGMnvs7axbPPxFPt+rFuWxaN+xrTuSBISEoHkFprWQ5azOYsqMU8O/pEl133X+99HSUlJFC1sRZ9+A+jXfyAAkZGRFClkzvxFS2n98y9fNb6oqCjMTY2JjMy87/E3fyv+OnyFPIZ5v/g8L54/o1314pka65dQ14qWEDlaXFwcp06eoG49V2WahoYGdeu6cjQwIAsjUy9STqo0NBS0cnXEQE+HoHO3U81jZKBHVHSMsjLzhvfA5tz5bwQHF3ng1qTy1whXrd0MCSE0NJS6dd++t4yNjalS1YmgXPjeyglklpMQWeDRo0ckJCRgZmaukm5mbk5w8OUsikr9SDklK13MHP/5PdHT0eL5yzh+/m0Fl2+m7HIzNc7D0I51WbxJdYzRmPk72X/iOi9i4nGtas+Mgc0x1NdhzrojX+sW1E5oaCiQ/F56l5m5OWFhoVkR0leTU2c5SYVGCCHU3JVbj3By98HYQI8f6pZhwYhW1O85X6VSkzePLv9O68Clm+GMX7hb5fg/luxV/vvMlfvk0dehX9taubpCk5vJwymFEBmmQIECaGpqEh4eppIeHhaGhYVFFkWlfqScksW/SuDG3cecCr7HyLk7OHftAR4/V1fuN8yjg593J569iOXn31bw6r3upvcdu3Cbb8zzoaOtmdmhq60375/wsJTvLXPz3PPeykmkQiNEFtDR0aFCxUrs27tHmZaYmMi+fXuoWs05CyNTL1JOqdNQaKCrndzAnjePLlu8OxMXn8BPg5YTG/fqk8c72lsREfWCuPiEzA5VbdnY2mJhYcG+fW/fW1FRURw7GoRTDn9vaaBI96aOckyXk42NDZ6ennh6emZ1KLna8+fPuX7tmvL1zZAQzpw+jUn+/BQuXDgLI1M/fTz707WTO5UqVaZylarM8vHmRXQ0bu4dszo0tZLby2lsjwbsCLjCndCn5DXQ4ef65alV0ZamnouTKzMzOqOvp03HMSswMtBVrkHz8Gk0iYlJNKpREjMTQ45euE1M3CvqVbFjsHsdvFcdyOI7y3yf+j7y6OPJ5InjsbOzx8bGljGjR2BpZZXjZ2bm1C6nHFOhOXbsGAYGBhl+3gULFjBr1iyuX7+OlpYWtra2tG7dmqFDh2b4tXKCkyeO08C1jvL1kEH9AWjX3p0Fi5dmUVTqqVXrn3n08CFjx4wkLDQUx3Ll2bRlO+bvDVLM7XJ7ORU0MWTRyNZYmOYl8nkM568/oKnnYvYeu0bNCkWpWib5h8LF9YNVjnP4YTK3Q58Q/yqBX39yZkrfJigUcP3uY4b4bGHxpmNZcTtf1ae+jwYMHMyL6Gh69ejG06dPcaleA78t29HT08uqkEU6yDo0H7F48WJ69+6Nj48P3377LbGxsZw9e5bz588zYcKErA5PSV3XoREip8uqdWiyG3VYh0bdfc11aNYGXEv3OjStne1kHZovVbt2bXr16kWvXr0wNjamQIECjBgxgjf1MRsbG7y9vZX5FQoFCxcu5IcffiBPnjzY29vj5+enck4/Pz/s7e3R09OjTp06LFu2DIVCwdOnT5X7W7duTefOnbGzs6N06dK0adMmRWVm8eLFlC5dGl1dXSwtLenVq5dyn5eXF2XLlsXAwABra2t69uzJ8+fPlfuXLl1Kvnz52LFjByVLlsTQ0JCGDRvy4MGDDC5BIYQQ4m2XU3o2dZRtKjQAy5YtQ0tLi6NHjzJjxgy8vLxYuHDhB/OPGTOG1q1bc/bsWRo1akTbtm2JiIgAICQkhJ9++okWLVpw5swZfv31V4YNG6ZyvIWFBYGBgdy6deuD15g7dy4eHh5069aNc+fO4efnh52dnXK/hoYGPj4+XLhwgWXLlrF3714GD1ZtGn7x4gVTp05lxYoVHDhwgNu3bzNw4MAPXjM2NpaoqCiVTQghhMjNslWFxtramunTp+Pg4EDbtm3p3bs306dP/2D+Dh060KZNG+zs7Jg4cSLPnz/n6OuH2s2bNw8HBwf+/PNPHBwc+OWXX+jQoYPK8aNGjSJfvnzY2Njg4OBAhw4dWLt2LYmJb6dEjh8/ngEDBtC3b1+KFy9OlSpVVAYme3p6UqdOHWxsbKhbty7jx49n7dq1KteJj4/H19eXypUrU7FiRXr16sWePXv4kEmTJmFsbKzcrK2tP6MUhRBC5GaKdM5wUqjpLKdsVaGpVq2aylM+nZ2duXr1KgkJqU89dHR8+zRZAwMDjIyMlA+0Cw4OpkqVKir5q1atqvLa0tKSgIAAzp07R9++fXn16hXu7u40bNiQxMREwsPDuX//PvXq1ftgzLt376ZevXoUKlSIvHnz0r59ex4/fsyLFy+UefLkyUOxYsVUrvuxB+8NHTqUyMhI5Xbnzp0P5hVCCCHeJV1O2ZC2trbKa4VCodK6klZlypShZ8+e/PXXX+zatYtdu3axf/9+9PX1P3rczZs3adKkCY6Ojvzzzz+cOHGC2bOTn/oaFxf30Tg/NlZbV1cXIyMjlU0IIYRIC6nQqIGgoCCV14GBgdjb26Op+fmrXTo4OHD8uOqTao8d+/Q0xlKlSgHJj6XPmzcvNjY2H+weOnHiBImJiUybNo1q1apRvHhx7t+//9mxfk2+c2bjYGdDPkM9aro4cezo0Y/m/2f9OsqVKUE+Qz0qly/L9v+2qexPSkpi7OiR2FpbYpJXn0YNXLl29apyf2xsLJ3c22OW34iypYqzd4/qku1e0/6kX9/eGXeDGUTKKW2knFQZ5tHhT88mBG8YQoT/OPbN70Glkt+o5HEoUpB1U9wI3TWaR3vHcmiRB9bmxh88547Z3XgZ8EeKbcPUDso8wzq7cnpNfx7tHcv9HaPY6tOZKqXedlXraGuyaGRrwnaP5uzfA6hTxU7lGv3a1sKrf7OMKYR0yOj3U9dOHdDXVqhszRo3VO5X9/eTUJWtKjS3b9+mf//+BAcHs3r1ambOnEnfvn2/6Fy//vorly9fZsiQIVy5coW1a9eydOlSAGW3Vo8ePRg3bhyHDx/m1q1bBAYG4ubmRsGCBXF2Tl5JcvTo0UybNg0fHx+uXr3KyZMnmTlzJgB2dnbEx8czc+ZMbty4wYoVK/D19U1/QWSSdWv/Zsig/gwbPoqAoydxdCxHs8YNPtj9FXDkCO7t2uDesTOBx07RtHkLWrdswYXz55V5pk2dwpxZPvjM9uXA4SAMDAxo2rgBMTExACxaMJ9Tp07gfzCATl260aH9/5StUzdDQliyaAFjxqnPFHmQckorKaeU5g5tSd0q9nQau5bK7bzZHXSVrT5dsCqY3MpqWyg/e+Z158qthzTwmE+V9t5MWrKXmI+s/vvL0BXYNB6v3Cr+z4tXrxLYsPecMs+1Ow/pN82Pyu28qdd9LrcePGXzjM4UyJe8dlfn5k5UKFGI2l3nsHjTUZaO/kV5bBFLEzo2q8Io3x2ZVCppkxnvJ4D6DRoScueBclv212rlPnV/P30pRQb8p46yVYXGzc2Nly9fUrVqVTw8POjbty/dunX7onPZ2tqyfv16NmzYgKOjI3PnzlXOctLVTV5p09XVlcDAQFq1akXx4sVp2bIlenp67NmzB1NTUwDc3d3x9vZmzpw5lC5dmiZNmnD19S/GcuXK4eXlxeTJkylTpgwrV65k0qRJGVASmcPH24uOnbvi1qEjJUuVYuYcX/Tz5GHZ0sWp5p89awb1GzSk/4BBlChZklFjxlG+QkV858wCkn9Nz/bxZsjvw2narDllHR1ZuGQ5D+7fx2/TRgCCL1+icZNmlCpdmu49PHj48CGPHj0CoE+vHoyfOFntutSknNJGykmVnq4WLWqXYdjsbRw+HcKNu4+ZsGg31+8+ousP1QAY82sDdhwJZtjs/zhz5T4h9yLYeugSD59Ef/C8T6JeEhbxXLnVq2rPi9h4Nuw9q8zz984z7Dt2jZv3I7gUEs6QGVswNtSjjF3yM4scbAqy9eAlLoWE4/tPAGb5DZWVHZ/BLRg+ZzvPXsRmYul8Wka/n97Q0dXFwsJCuZmYmCj3qfP7KT00FOnf1FG2qtBoa2szd+5cIiMjiYiIYMKECcrWlJs3b6rMLkpKSqJFixYqxz99+lRlJlOzZs24evUqMTEx7Nu3j8ePH/PNN98oV4ls2bIlW7du5f79+8TGxnLv3j3Wr19P2bJlVc77prUnLi6O+/fv4+Pjo9zXr18/7t+/z4sXL9i+fTvt27cnKSmJfPnyAckzsd6se/NGixYtPjqGJjPExcVx6uQJ6tZzVaZpaGhQt64rRwMDUj0mKDCAOnVdVdK+q9+AoNf5b4aEEBoaSt138hgbG1OlqpMyT1nHchw5fIiXL1+ya+cOLCwtKVCgAKtXrURXT4/mLX7I6FtNFymntJFySklLUwMtLc0UrS0xsa9wKWeDQqGgoUsJrt55hN/0TtzaOpwDC3vStFapz7qOe9MqrNt1hhcx8anu19bSpHOLqjx99pJzV5PXuzp37QEu5WzQ09XiO6fiPHgYxaOn0fxSvzyxsa/w23/hy246g2TG++mNg/v9KWxlhmNpB/p49ODx48fKfer8fhIp5ZhHH3yJOXPmUKVKFUxNTTl8+DB//vmnyqJ4ucmjR49ISEjAzEx1OXkzc3OCgy+nekxYaChm7y0/b2ZmTlhYKAChoaHKc7x/zjd53Dt24vy5s1RwLIWpaQH+WrWWJ0+eMG7MSHbs9mf0yOGsW7uGokWL4btgMYUKFcqQ+/1SUk5pI+WU0vMXcQSeu8XQjvUIvhlOWMRzWn9XDqcyhbl+9zFmJgbkNdBlYPvajJm/k+Fz/qN+teKsmdSOBr0WcOhUyCevUbnUN5QpZkGPietT7Pu+egmWj21DHj1tQh8/o0nfRTyOTJ5tuWzzccrYWXJqVX8eP42m3fCVmBjpM6LrdzTwmM+obvVp9Z0jN+5G0H3ieu4//LprX2XG+wnguwYNaf7Dj9jY2HLjxnVGjfid5k2+Z/+hADQ1NdX6/ZQe6e02Utcup1xdobl69Srjx48nIiKCwoULM2DAAHlG01emra2N98zZKmndOnekp0cfzpw+xWa/jRw9cQavqVMY0K8Pa9b+k0WRZi0pp7RR93LqNOZv5g37iRubh/HqVQKnr9xn7a4zVChRCI3X7fhbDl5k5ppDAJy9+gCnskXo2sIpTRUa96ZVOHftAccv3k2xb/+J6zi5+1DAOA8dm1flr/H/o1aX2Tx8Es2rhET6Td1Ev3fyzxv2E3PWHaFccSua1ipF1fYz6N/uW6b1a0ab3//KkPLIaq1/fjtWqEzZspQt60gph2Ic2O9Pnbr11P799KVy6sMps02Xk7+/v8qjDTLC9OnTuX//PjExMVy5coURI0agpZU763gFChRAU1OT8PAwlfTwsDAsLCxSPcbcwoLwsPfyh4dhbp6c/81xKfKEvc3zvv3++7h48QI9PHpxYL8/DRo2wsDAgJY/tebgfv8vubUMJeWUNlJOqQu5F0H9nvMxrTMC+xZ/ULPzbLS1NAi5F8Gjpy+If5XApRDVQa7BN8Oxtsj3yXPn0dOmlWs5lm0+nur+FzHx3Lj7mKMX7tBj4j+8SkjEvWmVVPPWqliUUkXNmbv+CLUqFmVHQDAvYuL5Z89Zala0/ez7Tq/MeD+lxrZoUQoUKKDyhO53qdv7SajKNhUakbl0dHSoULES+/a+nYKemJjIvn17qFrNOdVjnKo5479Pdcr6nt27cHqd38bWFgsLC/a9kycqKopjR4OUed4VExODZx8PZs2Zh6amJgkJCcTHJ48DiI+P/+ACil+TlFPaSDl93IuYeEIfPyNfXn1cnYqz5eBF4l8lcOLSXYoXLqCS175wQW6HPv3kOX+s64iutiart59KUwwaCgW62il/wOnqaOE9sDm9Jv9LYmISmhoaaGslL42hraWJpsbX/7ORGe+n1Ny9e5fHjx9jYWmZYp86v58+l4L0znRST1KhEUp9PPuzZNEC/lq+jMuXLtHHowcvoqNxc+8IQOcObowY9rZLzqNXX3bu2I739GkEX77M+LGjOXniON17Jo9DUigUePTxZPLE8WzZ7Mf5c+fo3NENSysrmjVvkeL6kyaMo0HDRpSvUAEAZ5fqbNq4gXNnz+I7ZxbOLtUzvQzSQsopbaScUnJ1sue7asUpYmlC3Sp2bJ/VlSu3HrJ8S3KryvSVB/jJ1ZGOzapQ9BtTuv/kTKPqJZj/z9uBrAtHtmZsjwYpzt2haWU2H7hIRNQLlfQ8etqM6d6AqqWtKWyRjwoOhfAd9hNWBY1UZkK9MbRjXXYEBHPmSvKaWQHnbtL829KUKWZB959cCDj74WfbZaaMfj89f/6coUMGERQYyK2bN9m3dw+tf2xOMTs7vqufsnzV8f30pXLqLKfc2b8iUtWq9c88eviQsWNGEhYaimO58mzash3z1wPr7ty5jcY7v86cXVxYumIVY0YNZ9Tw37Gzt2ftPxspXaaMMs+AgYN5ER1Nrx7dePr0KS7Va+C3ZbtyJtkbF86f55/1awk6flqZ9mPLnzi43x/XOjWxL+7AshWrMrcA0kjKKW2knFIyNtRjbPeGFDIzJiLqBZv8zzPKdwevEpJXMPfbf4HeUzYyyK020/o348qth7T5fSVH3qlEWJvnIzFRdRakfeECVC9vS+M+KR/Wm5CYhEORgrRr1A5TYwMiIl9w/NJdXHvMS9G9VaqoOS3rOeLkNkOZtmHveWpWKMpu3+5cvf0Q91FrMrJI0iyj30+ampqcP3eWlSuW8fTpUyytrHB1rc/IMeOUS3e8oa7vJ6FKkfS15weLDBcVFYWxsTFhjyOz5ZoIQmRXJjV/y+oQsoUnB//I6hDUXlRUFOamxkRGZt73+Ju/Ff+duImB4ZdfI/p5FN9XssnUWL+EtNAIIYQQuUhOneUkFRohhBAiF1G83tJzvDqSQcFCCCGEyPakhUYIIYTIRTRQoJGOfiMNNW2jkQqNEEIIkYtIl5MQQgghhJqSFhohhBAiN8mhTTRSoRFCCCFykZz6tG3pchJCCCFEtictNEIIIURuks6F9dS0gUYqNEIIIURukkOH0EiXkxBCCCGyP2mhEUIIIXKTHNpEIxUaIYQQIhfJqbOcpEIjhBBC5CI59WnbMoZGCCGEENmetNAIIYQQuUgOHUIjFRohhBAiV8mhNRrpchJCCCFEticVGiGEECIXUWTAf59j0qRJVKlShbx582JmZkaLFi0IDg5WyRMTE4OHhwempqYYGhrSsmVLwsLCPus6UqERQgghcpE3s5zSs32O/fv34+HhQWBgILt27SI+Pp769esTHR2tzNOvXz82b97MunXr2L9/P/fv3+fHH3/8rOvIGBohhBBCZJrt27ervF66dClmZmacOHGCWrVqERkZyaJFi1i1ahV169YFYMmSJZQsWZLAwECqVauWputIC40QQgiRiygyYAOIiopS2WJjY9N0/cjISADy588PwIkTJ4iPj8fV1VWZp0SJEhQuXJiAgIA035e00AghxBe6t3t8VoeQLZhU7Z3VIai9pIS4r3exDJrlZG1trZI8atQoRo8e/dFDExMT8fT0pHr16pQpUwaA0NBQdHR0yJcvn0pec3NzQkND0xyWVGiEEEII8dnu3LmDkZGR8rWuru4nj/Hw8OD8+fMcOnQow+ORCo0QQgiRi2TUs5yMjIxUKjSf0qtXL7Zs2cKBAwf45ptvlOkWFhbExcXx9OlTlVaasLAwLCws0nx+GUMjhBBC5CJfe5ZTUlISvXr14t9//2Xv3r3Y2tqq7K9UqRLa2trs2bNHmRYcHMzt27dxdnZO83WkhUYIIYTIRb72QsEeHh6sWrWKTZs2kTdvXuW4GGNjY/T19TE2NqZz587079+f/PnzY2RkRO/evXF2dk7zDCeQCo0QQgghMtHcuXMBqF27tkr6kiVL6NChAwDTp09HQ0ODli1bEhsbS4MGDZgzZ85nXUcqNEIIIURu8pWbaJKSkj6ZR09Pj9mzZzN79uwvDEoqNEIIIUSuklGDgtWNDAoWQgghRLYnLTRCCCFELvIlM5XeP14dSYVGCCGEyEW+9iynr0W6nIQQQgiR7UkLjRBCCJGb5NAmGqnQCCGEELmIzHISQgghhFBT0kIjhBBC5CIyy0kIIYQQ2V4OHUIjFRohhBAiV8mhNRoZQyOEEEKIbE9aaIQQQohcJKfOcpIKjRBCCJGbpHNQsJrWZ6TLSQghhBDZn7TQCCGEELlIDh0TLBUaIYQQIlfJoTUa6XISX2z82NHoaytUtnJlSqjkCQwIoOF3dTE1NsAsvxGudWrx8uXLrAlYDfnOmY2DnQ35DPWo6eLEsaNHszoktSTlpOrIoYP8r1ULStkVxtRQm62bN6nsNzXUTnWb6T0tiyL+MtUrFmO9dzdu7BjPy5MzaVrbUWW/gb4O04e04tp/Y4k4Mo2T63+nS8vqHz1nxx9c2L3Ik/v+k7nvP5mtc3tRuXQRlTwvT85MdevnVi/F+XS0tQhcPYSXJ2fiWLxQ+m9afDGp0Ih0KVW6NCF3Hii3Pf6HlPsCAwJo3qQh9b6rz8EjRzkUcIzuPXuhoSFvO4B1a/9myKD+DBs+ioCjJ3F0LEezxg0IDw/P6tDUipRTSi9eRFO6jCNTvHxS3X/x+h2VzWfuAhQKBU2b//CVI00fAz1dzl25h+cfa1PdP3nAj3znUpKOw5dTvuUEZq3yZ/qQVjSuVeaD56xVyY6120/QsJsPtTt4cTfsCZvn9MSqoLEyj813v6ts3Ub/RWJiIv/uOZ3ifBP7NufBw8h03+vXpMiA/9SRdDmJdNHS1MLCwiLVfYMH9qNnrz4MGvybMq24g8PXCk3t+Xh70bFzV9w6dARg5hxf/vtvK8uWLlYps9xOyikl1/oNca3f8IP7zc1VP5P/bd1MjVq1sbEtmtmhZaidRy6y88jFD+6v5mjLX5uDOHjiGgCLNxyhc8vqVC5ThK0Hzqd6TMfhy1Ve9xi7ihZ1y1G7qgOrtia3/IU9fqaSp+m3juw/fpWb9x6rpNd3KUU95xK0GbiIhjVKf/b9ZZWc+ugD+aks0uXatavYFraiZPGidGjfltu3bwMQHh7OsaNBFCxoRu2aLhQpZM53db/l8KFDnzhj7hAXF8epkyeoW89VmaahoUHduq4cDQzIwsjUi5RT+oWHhbFr+zbauXfM6lAyXODZEJp8W1bZulKrsj32hc3YHXg5zefIo6eDtpYmT6KiU91vlj8vDWuUZtnGgBTpc0b8Qufhy3kRE/flNyEyjFRoxBerUtWJ+YuW4rdlOz6z5nLzZgiudWry7NkzQm7cAGDCuNF06tyVTVu2U75CRRo1qMe1q1ezOPKs9+jRIxISEjAzM1dJNzM3JzQ0NIuiUj9STum3ZtUKDPPmpUmz7NXdlBb9J6/n0o1Qru8YT1SQN36zeuD5xzoOn7ye5nOM75PcZbQ3KDjV/e2aVuXZixg27j2jkj5/TDsWrD/MyUt30nUPWUGRAZs6ki4n8cUaNPxe+e+yjo5UqeqEQ7Ei/LNuLQ4lSgLQueuvyq6C8hUq4L93D8uWLmbchElZErMQuc3K5Uv5qXUb9PT0sjqUDNfzl1pULWtDS8953H4QQY2Kdnj/1ooHDyPZdzT1Csq7Bnb4jlYNKtKgmw+xca9SzePWzJm//zuusr/nL9+SN48ufy7ZmWH38lXl0FlOUqERGSZfvnzY2Rfn+vVr1K5TF4CSJUup5HEoWZI7r7ulcrMCBQqgqalJeHiYSnp4WNgHxyTlRlJO6RNw+BDXrgazaPnKrA4lw+npajOmV1N+HrCQ7YcuAHD+6n0cixfC063uJys0nu3rMqCjK427z+L81fup5qleoRgOtua0/22JSnrtKsVxcrQlMnC6Svrhvwax5r/jdB31VzruLPPl1EcfSJeTyDDPnz8n5MZ1LCwsKWJjg6WVFVeuqH6pXLtyhcJFinzgDLmHjo4OFSpWYt/ePcq0xMRE9u3bQ9VqzlkYmXqRckqfv5YvplyFipQpWy6rQ8lw2lqa6GhrkZiYpJKekJiIxidGrfZ3r8dvXRrSvNfcj3YZuTd35sTF25y7ek8lfcCf66n6yx84tZmMU5vJtOjjC0D735YwevaWL7wjkV7SQiO+2G+DB9K4SVMKFy7C/fv3GT92FJqamrT+pQ0KhYJ+/QcxfuwoyjqWo1y58vy1YhnBwZdZ9ff6rA5dLfTx7E/XTu5UqlSZylWqMsvHmxfR0bjlwMGb6SHllFLyj4dryte3b4Vw7uxpTEzy8411YQCioqLw+/cfxk6cklVhppuBvg7FrAsqX9sUMsWxeCGeRL3gTugTDhy/ykTP5ryMjeP2gyfUrGRH28ZVGeL17wfPOcDdlRE9GtHh92Xcuv8Yc9O8ADx/EUv0y7eDe/Ma6PHjd+X5LZVz3Ql9ovL6+YtYAG7cfcS98KfpueWvQkE6ZzllWCQZSyo0QIcOHXj69CkbN25USd+/fz9jxozh9OnTxMTEUKhQIVxcXFiwYAE6OjpZE6wauXfvLm7t2hDx+DEFChbEpXoN9h8KpGDB5C+g3n09iYmNYfDAfjyJiKCsYzm2/LeLosWKZXHk6qFV65959PAhY8eMJCw0FMdy5dm0ZTvm5uafPjgXkXJK6fTJEzRv9Hbm1/DfBgHwS9v2zJ63GIB/1/9NUlISLVv9kiUxZoSKpQqzc0Ff5espA34EYIVfEN1G/4Xb0CWM7d2MpRPcMTHKw+0HTxg9ewsL1r+dTTl/dDuKWOWnQbfkNXu6tqqBro42q6d2UbnW+HnbmDDvP+XrVg0qokDB2h0nMvMWs0QOHUKDIikpKenT2XKmhIQEFAoFnTp1SlGhuXjxIpUqVaJ37964ubmhr6/P1atX+eeff/Dx8UFfXz/rAn9PVFQUxsbGhD2OxMjIKKvDESLXeBGb+kBSoapQzX5Zdu2dC/qw//hVlcqKOkpKiCP27HwiIzPve/zN34oLIeHkTcc1nkVFUdrWLFNj/RLZagxN7dq16dWrF7169cLY2JgCBQowYsQI3tTJnjx5gpubGyYmJuTJk4fvv/+eq+9MEV66dCn58uXDz8+PUqVKoaurS6dOnVi2bBmbNm1CoVCgUCjw9/dn586dWFhYMGXKFMqUKUOxYsVo2LAhCxYsUKnMHD58mNq1a5MnTx5MTExo0KABT54kN0du376dGjVqkC9fPkxNTWnSpAnXr7+dTnjz5k0UCgUbNmygTp065MmTh3LlyhEQIOtrCCFEehkZ6lH0mwJ4L9/z6cy5yJuF9dKzqaNsVaEBWLZsGVpaWhw9epQZM2bg5eXFwoULgeSuo+PHj+Pn50dAQABJSUk0atSI+Ph45fEvXrxg8uTJLFy4kAsXLuDj40Pr1q1p2LAhDx484MGDB7i4uGBhYcGDBw84cODAB2M5ffo09erVo1SpUgQEBHDo0CGaNm1KQkICANHR0fTv35/jx4+zZ88eNDQ0+OGHH0hMTFQ5z7Bhwxg4cCCnT5+mePHitGnThlevPvzLLzY2lqioKJVNCCGEqqjnMdh9P1JlbIyAnLoSTbYbQ2Ntbc306dNRKBQ4ODhw7tw5pk+fTu3atfHz8+Pw4cO4uLgAsHLlSqytrdm4cSOtWrUCID4+njlz5lCu3NtR//r6+sTGxqpMA23VqhU7duzg22+/xcLCgmrVqlGvXj3c3NyUTWxTpkyhcuXKzJkzR3lc6dJvl79u2bKlSuyLFy+mYMGCXLx4kTJl3j5rZODAgTRu3BiAMWPGULp0aa5du0aJEqoPenxj0qRJjBkz5ovKTwghhMiJsl0LTbVq1VC8097l7OzM1atXuXjxIlpaWjg5OSn3mZqa4uDgwKVLl5RpOjo6ODqqPrE1NZqamixZsoS7d+8yZcoUChUqxMSJEyldujQPHjwA3rbQfMjVq1dp06YNRYsWxcjICBsbGwDl4wHeeDceS0tLgI8+eG/o0KFERkYqtzt3st9KlUIIIbKGdDnlEPr6+ioVok8pVKgQ7du3Z9asWVy4cIGYmBh8fX2V5/qYpk2bEhERwYIFCwgKCiIoKAhIfj7Nu7S1tZX/fhPb+91S79LV1cXIyEhlE0IIIdIiZ3Y4ZcMKzZtKwRuBgYHY29tTqlQpXr16pbL/8ePHBAcHU6pUqfdPo0JHR0c57uVjTExMsLS0JDo6+SFmjo6O7NmT+mCzN9cePnw49erVo2TJksrBwurMd85sHOxsyGeoR00XJ44dPfrR/P+sX0e5MiXIZ6hH5fJl2f7fNpX9G//dQJPv61PI3BR9bQVnTp9OcY7BA/tjZZYfO1trVq9SXdH0n/XraNmiabrvK6NldDklJSUxdvRIbK0tMcmrT6MGrirPvIqNjaWTe3vM8htRtlRx9u7ZrXK817Q/6de3d8bdYAaRcvq4yRPGYmqorbI5VSjz0WM2bViPU4UyWJkaUqNqeXbtSDl7J/jyJdq2/gEbK1OszYypV6sad++8bRke/ttAilmbUdbBlnV/r0px/v+1apEh9/elDPPo8ufAHwneOoaII9PYt6QflUoVVu43y5+X+aPbcWPHeB4fnsamWT1U1qv5EGNDfab/1oobO8bzNNCLs/+OoEF11b8Pv7auyeUto3kS4MWBZQOoXFp1IdDJ/X/g3r4/uLptLL98X1ll34+u5Vnv3S0ddy7SI9tVaG7fvk3//v0JDg5m9erVzJw5k759+2Jvb0/z5s3p2rUrhw4d4syZM7Rr145ChQrRvHnzj57TxsaGs2fPEhwczKNHj4iPj2fevHn06NGDnTt3cv36dS5cuMCQIUO4cOECTZsm/4EdOnQox44do2fPnpw9e5bLly8zd+5cHj16hImJCaampsyfP59r166xd+9e+vfv/zWK6IutW/s3Qwb1Z9jwUQQcPYmjYzmaNW7wwe6vgCNHcG/XBveOnQk8doqmzVvQumULLpw/r8zzIjoal+o1GD9xcqrn2LplM2vXrGLztp1MmDSFnr924dGjRwBERkYyeuQwpvvMzvibTYfMKKdpU6cwZ5YPPrN9OXA4CAMDA5o2bkBMTAwAixbM59SpE/gfDKBTl250aP8/5ey+myEhLFm0gDHjJmT+zX8GKae0KVGyNBev31Fu23b5fzDv0cAjdO3YjnbuHdl3+BiNmjSn/S8tuXThbRmF3LhO4/q1sS/ugN9/uzkQeJKBQ4ahq5v8LKft27bwz9o1rN+0jdHjJuHp8SuPX3/moiIjmTB2JFO8fDL1nj9l7sj/UdepBJ1GLKfyz5PYHXiZrXN7KZ+qvdarK7bfmNKq33yq/W8ytx9EsM23F3n0Prw+mLaWJlvnelDE0pS2gxfh+MN4eo5bzf3wSGWen+pXZHL/H5gw/z+c/zeFs1fv4Te7JwVNDAFoVKsMrRtWpmnP2QybsYk5I9pgms8ASJ5RNdqjKf3+WJeJJZMxpMtJTbi5ufHy5UuqVq2Kh4cHffv2pVu35BrxkiVLqFSpEk2aNMHZ2ZmkpCS2bdum0qWTmq5du+Lg4EDlypUpWLAghw8fpmrVqjx//pzu3btTunRpvv32WwIDA9m4cSPffvst/2/vzuNqyv8/gL/a94X2kkLaKHvElyxRX8uEmTFfS0IYEVnGYCwhaYbJkkHWGmasYx3GrrIv02qoq1KWQYuSQlru+/dHv46uitKmvJ8e98E953M+y9s5937uOZ/POQBgbm6O06dPIzo6GnZ2drC3t8eRI0cgKysLaWlp7NmzB+Hh4WjdujVmzJiBlStX1nh8qiJgzSqMdZ+A0WPGwsraGus2BEJJWRm/Bm8vM/36X9ain5MzZs6aDUsrK3gv8UHbdu0RuOEXIc2IUa74YcEi9O7jWGYecXGx6O7QEx06dsQ3/xsOdXV1JCclAQDmz/0eEyZ6oGnTpmVuW1eqO05EhPUBazDnhwUY9IULbGxtsTVoB548foyjRw4DKPrFPWDgF7Bu1QqTPKYgLS1N6PhN8/TAsuU/fXKXHjlOFSMrKwM9PX3hpaWtXW7aTRt+QZ++Tpg6fRYsLK3ww6IlsG3bDls3vZ2Y4LtkERz7OWPxsh9h26YdmjVvgf8OGAQdXV0AwF1RHLp1d0C79h3x5bD/QU1NHffvFx1zixfMxdjxE4W7DdcFRQU5DO7dBvPXHsHliETce5gO300nkPgoDRO+/g/Mmuqgs20zTFu+F+F3HiD+fiqmLd8HRQU5DHPuUG6+bi5d0EhdGcNmbcbV6CQ8eJKBSxEJEo81mDayF4IOXcXOo9cRl/QUU3334nVuHtxcih6zYdlMDxfD4xER+xD7ToXjxctcmBpqAQB8vVyw5Y9Lpe4i/CmSqoY/n6J616GRk5PDxo0bkZWVhYyMDPj6+grjTho1aoQdO3bg+fPnePXqFU6ePImWLVsK2xbfEfhdOjo6OH36NLKzs0FE6NmzJ9q1a4edO3fi3r17yM3NRXp6OsLCwoSzM8UcHBxw+fJl5ObmIjMzEydPnoSmpiYAwNHREXfu3EFubi6io6Ph4OAAIsLgwYMBFJ0ZIiK0bdtWyE9TU1OoQ23Ky8tDZES4RMdDWloavXs74sa1su+Lc/3aVfTqLdlR6dvPCdfLSV8WW9s2iAj/G5mZmYgID8fr16/RwswMly9dQmRkBKZMnfZxDaohNRGn5KQkPH36FL1LpNHQ0EAnu85CGhvbNrhy+RJev36NM6dPQd/AANra2ti963coKCrCZfCQ6m5qlXCcKu5eYgKszZqifWtzfDvOVeLS0Ltu3rgGh/9/8Gux3n364eaNawCKxt6dPvUXzMzM8ZVLf1iYGqJvz644/ucRIX1rG1tERYbjeWYmoiLD8Tr3NZo3N8O1K5cQHR2JiR51e0lOVkYasrIyyM3Ll1iem5uPrm1bQEG+aHJubomnXxMR8vIK0LVt+XchH+Bgg+u3krFm7jAkn/HF3/vmYfa4fpCWLvr+kJOVQTsrY5y//vb5c0SE89dFsLM1BQDE3P0X7a2bQlNNCe2sjKGkIIfEh2no2rY52lkaY/3u0GqKQg1roINo6l2HhtWM9PR0FBYWQldX8nbyunp6ePr0aZnbpDx9Ct13bj+vq6uHlJSy05elbz8nDB8xCv+x74SJ7mOwZfuvUFFRgZenB9atD8TmwI2wbWWBXj264c7t25VvWDWriTgVb1cqjd7bNG5jx8HWtg3a2VrjJz9f/LZrHzIzM+GzZBFWrVmHxYsWoJWlGQb1d8K//0o+SK8ucJwqpkMnO/wSuA37Dx/Dz2t+wf37yRjQrxeys7PLTJ+a8hQ6OpLt19HVRWpK0dPI09JS8TInB2tXrUCfvv3wx9G/MGDQYLiN+BqXLxbdU6u3Yz98/c0IODrYw/Nbd6zftB3KKir4bron/Neux/YtgbBr1wr/deyBuDu1f8zlvHqDa9H3MG+8Mwy01SEtLYX/9e+IzrbNoK+tDlFyCh48yYCP5yBoqilBTlYGs9wc0US/EfR1yj/71sxIG0P6tIWMtDSGTAvEj1tPwWtUb8wd7wwA0NZUgaysDFIzJO/rlZqRDX2tonzPXo3D7r9u4tJvs7F58ShM8P4NL1/nYe28bzB1+V5M/Lo7og8uwPntM2DVnJ8GX9vq3X1oWMOzYNFiLFi0WHjv67MEvfo4Qk5ODj/5LcPNyFs4cfwYxo8djSs3Gt5zVSpCTk4Oa9ZJjiWa6D4Wk6dMQ3RUJP48ehg3wqOx6ucVmDVjGvbsO1BHNa1b9S1Ojv2chX+3am2LDh3t0Ma6BY4c3I9RbuMqnV/x7Mj/DvgCHp7TAQA2tm1x8/pVBG/bjG7dewAA5sxfhDnzFwnbrVjuA4defSAnJ4dVK/xw8XokTp08jskTx+L8pfcP5K4J4xbuxCbvEbh32hcFBYWIinuEfafC0c7KGAUFYvzvu63YuGgEnoStQEFBIc7fEOHkpdvvncEqLS2FtIxsTFm2G2IxITL2IQx1NDB9dB8s31zxxyL4bjoh8RiFHyb+FyE3RMgvKMQcdyd0GuaH//Zoha0+rug28tMcZtBQn+VUr87QhIaGYs2aNXVdjQZJW1sbMjIySE1NkViempIiccPBkvT09YVfhkL61BTo6X38LxNRXBx27/oN3kt8cCEsFN2694COjg6+/HoYIiMjyv3lWltqIk7F25VKk1J+LMNCQ3Dnzm14TPHEhbBQODn3h4qKCr78ahguhoV+TNOqFcfp42hoaqKFWUvcu5dY5npdPX2kpUm2Py01VThrpaWlDVlZWZhbWkmkaWlhiUePyr6UdVcUh/17d2HewiW4dCEM9t26Q1tHB4OHfo3oqMg6OeaSHqWj34QAaHWdhZb9F6H76J8hJyuDpEfPAACRsQ/RZfhP0OsxG836LYCL50Zoaagg6d/0cvN8mp6F+AdpEIvfPr4wLikFBjoakJOVQfrzlygoKIRuY8mzPLqN1fD0Wdl3Yzc31cPw/h2xZMMx9OjQEpcjEpD+PAcHTkeivVVTqCorVEM0qh8PCmYNmry8PNq174CQ82+noYvFYoSEnINdF/syt+ncxR6hIZLT1s+dPYPO5aT/ECKC5+Rv8dPKVVBVVUVhYaHw2Irivysyvb4m1UScTJs1g76+PkJKpHnx4gVu3rheZixzc3MxfdoU/LJhE2RkZErFqa5jBHCcPlZOTg6Sk+6V20HrZNcFF0JDJJaFhpxFJ7suAP4/7h06IiFeJJEmMT4exsaS04+BomNu1rTJ8PFbCVVVVYjFb2NU8P9/i+swTq9y8/A0/QU01ZTgaG+JY2ExEutf5OQi/XkOWhjroL11UxwLvVVuXlejk9DCWFviLE5LEx08SctCfkEh8gsKERn7EL3szIX1UlJS6GVnjhsxyWXm+cv8bzBn1SG8fJ0HGRlpyMnKAIDwt4w0f8XWJo42E0ybPhNB27bgtx2/Ii42FtOmeODVy5cY7TYWAOA+ZjQWzp8npJ/i6YXTp05izWp/iOLisGzpYkSE/41Jkz2FNBkZGYiOikJs7B0AwN27IkRHRZU5jiJo21Zo6+hgwMCigdf2XbshLOQ8rl+7hnVrV8PK2loYcF2XqjtOUlJSmDJtOn5avgzH/jyKf27dgvvY0TAwNMQXLoNLle/n6wMn5/5o264dgKI4HTl8ELdiYhC44RfYd+1W4zGoCI7Thy364XtcvngBD+4n48a1Kxg9/CvISMvgy6//BwDwmDAGS73nC+m/neyJc2dOYX3AatwVxeEn36WIigjH+G8nC2k8vWbh8IH92BG0FfcSE7AlcD1OnTiGcRO+LVX+zuBt0NLWgXP/gQAAuy5dcfFCCG7euIaNv6yFhaU1NOrgmHO0t0TfrlYwMdRC784WOLl5Gu4mp2DH0aLBz0Md26J7BzOYGmlhoIMNjm+cgj9DY3DuWpyQx9alrljq+XYSx5b9F9FIXRn+s7+EWVMdOP+nFWaP64fAfW+f1xfwewjGDumKkQPtYNFMDwE/DIOykoJQbkljh3RFemYO/rpQNGX+atQ9OHQyh52NKaaO6oU7iU+QlfO6pkJUJQ11lhOPoWGCr4d9g/S0NCxdsggpT5/Ctk1bHDl2Enr/fzr74cMHkC7xi8O+a1cE79yFJd4L4L3gB5i1bIl9Bw6jVYnnVB3/8ygmjh8rvB89suiDev5Cb4lxMykpKfjpR1+EXLgiLOtkZwevGbMw1GUAdHR1sWXbrzXV9EqpiTjN+u57vHr5Ep4eE/H8+XN07fYfHD12EoqKihJl3/7nHxz4Yx+u/x0lLBv65Ve4GBYKx17d0dLcAr/ulLxRWl3hOH3Y43//xYSxo5CZ8Qxa2jroYt8Np0IuQVun6CZx/z58KBEjuy5dsXn7Tvj6eGPZ4gVo3qIldu45AKtWb2M08IvB8F+7Hmv8V2De7Bkwa2mO4N/3oUvX/0iUnZqSglUrf8SJc2+/0Dt0tMOUqTMw/CsXaGvrYv3mbTUcgbJpqCphqecgGOlpIiPrFY6cj4b3+j9RUFA0RkhfWwM/zRwKXS01PE1/gd+P3YDflpMSeRjrN5K4vPQo5Tm+8NyAFbOG4ubeeXic+hzrd4fBP/iMkOaP0xHQbqSKRR4DoKelhhjRv3Dx3IDUDMnLbrqN1TDHvR96jVklLPv79n2s/e08Dq6dhLTMbExY9FtNhKZ6NNBBNFJUfNcpVm+9ePECGhoaSHmW9cndY4OxhuzVm4IPJ2Iw6j6jrqvwyaPCPLyJ2YysrJr7HC/+rkj89xnUqlBG9osXaGGkVaN1/Rh8hoYxxhj7jDTQEzTcoWGMMcY+J1WdqcSznBhjjDHGagifoWGMMcY+K1WdqfRpnqLhDg1jjDH2GeFLTowxxhhjnyju0DDGGGOs3uNLTowxxthnpKFecuIODWOMMfYZqerjCz7VRx/wJSfGGGOM1Xt8hoYxxhj7jPAlJ8YYY4zVew310Qd8yYkxxhhj9R6foWGMMcY+Jw30FA13aBhjjLHPCM9yYowxxhj7RPEZGsYYY+wzwrOcGGOMMVbvNdAhNNyhYYwxxj4rDbRHw2NoGGOMMVbj1q9fD1NTUygqKqJz5864ceNGtebPHRrGGGPsMyJVDX8qa+/evZg5cya8vb0RERGBNm3awMnJCampqdXWLu7QMMYYY5+R4kHBVXlV1qpVqzBhwgSMHTsW1tbWCAwMhLKyMrZv315t7eIxNA0AEQEAsl+8qOOaMPZ5efWmoK6rUC9QYV5dV+GTVxyj4s/zmvSiit8Vxdu/m4+CggIUFBRKpc/Ly0N4eDjmzZsnLJOWloajoyOuXr1apbqUxB2aBiA7OxsAYNbMuI5rwhhjrCqys7OhoaFRI3nLy8tDX18fLavhu0JVVRXGxpL5eHt7Y/HixaXSpqeno7CwEHp6ehLL9fT0EBcXV+W6FOMOTQNgaGiIhw8fQk1NDVKfyA0CXrx4AWNjYzx8+BDq6up1XZ1PFsepYjhOFcNxqphPMU5EhOzsbBgaGtZYGYqKikhKSkJeXtXPmBFRqe+bss7O1Cbu0DQA0tLSaNKkSV1Xo0zq6uqfzAfGp4zjVDEcp4rhOFXMpxanmjozU5KioiIUFRVrvJyStLW1ISMjg5SUFInlKSkp0NfXr7ZyeFAwY4wxxmqMvLw8OnTogHPnzgnLxGIxzp07B3t7+2orh8/QMMYYY6xGzZw5E25ubujYsSPs7OywZs0avHz5EmPHjq22MrhDw2qEgoICvL296/ya6qeO41QxHKeK4ThVDMep9n3zzTdIS0vDokWL8PTpU7Rt2xYnT54sNVC4KqSoNuaIMcYYY4zVIB5DwxhjjLF6jzs0jDHGGKv3uEPDGGOMsXqPOzQMPXv2xPTp02u0jDFjxmDw4ME1WkZF1UZ7WdU09P8jU1NTrFmzpq6rwViDwh0aVivWrl2L4ODguq5GjQoODoampmaltwsNDYWUlFSp14IFC6q/kuyTcPPmTUycOLHa892yZQvatGkDVVVVaGpqol27dvDz86v2cuqD8n5EhYWFoXfv3mjcuDGUlZXRsmVLuLm5Vcvdc1nd4mnbrFbUxh0wa0peXh7k5eVrvByRSCRx11JVVdWPyqewsBBSUlKQlubfK58qHR2das9z+/btmD59OgICAuDg4IA3b94gJiYG//zzT7WX9Skr3v/LcufOHTg7O2Pq1KkICAiAkpIS4uPjceDAARQWFtZyTVm1I/bZc3BwoClTptCUKVNIXV2dtLS0aMGCBSQWi4mIKDc3l2bNmkWGhoakrKxMdnZ2FBISImwfFBREGhoadPLkSbK0tCQVFRVycnKix48fC2nc3NzIxcVFeP/ixQsaMWIEKSsrk76+Pq1atYocHBzIy8tLSGNiYkK+vr40duxYUlVVJWNjY9q0aVONt9fExISWLl1Krq6upKamRm5ubhQSEkIAKDMzU8gnMjKSAFBSUpKwvuTL29u7QvErK++SMjIyyNXVlTQ1NUlJSYmcnZ3p7t27wvri+B85coSsrKxIRkaGkpKSKDc3l77//ntq0qQJycvLU4sWLWjr1q3Cdrdu3SJnZ2dSUVEhXV1dGjVqFKWlpVU5vpWVk5NDrq6upKKiQvr6+vTzzz9L7Asfan9ycjINHDiQNDU1SVlZmaytren48eO13o6SKrKPrV69WkgPgLZs2UKDBw8mJSUlMjMzoyNHjkjkeeTIETIzMyMFBQXq2bMnBQcHS+w3Li4uNGbMmA/Wbdu2bWRtbU3y8vKkr69PU6ZMEdb5+/tT69atSVlZmZo0aUIeHh6UnZ0trK/IsV7dsfqY/d/Nza3U8RgSEkKrV68mU1PTD9bp0qVL5ODgQEpKSqSpqUn9+vWjjIwMIiI6ceIEdevWjTQ0NKhx48Y0YMAASkhIELZNSkoiAHTgwAHq2bMnKSkpka2tLV25cuWjY8Qqhjs0jBwcHEhVVZW8vLwoLi6OfvvtN1JWVqbNmzcTEdH48eOpa9eudOHCBUpISKCVK1eSgoKC8KESFBREcnJy5OjoSDdv3qTw8HCysrKiESNGCGW826EZP348mZiY0NmzZ+nWrVs0ZMgQUlNTK9Whady4Ma1fv57i4+PJz8+PpKWlKS4urkbba2JiQurq6vTzzz9TQkICJSQkfLBD8+bNG1qzZg2pq6vTkydP6MmTJ8IXwYfi96EOzRdffEFWVlZ04cIFioqKIicnJzIzM6O8vDyJ+Hft2pUuX75McXFx9PLlSxo2bBgZGxvTwYMHKTExkc6ePUt79uwhIqLMzEzS0dGhefPmUWxsLEVERFDfvn2pV69eVYrtx/Dw8KCmTZvS2bNnKSYmhgYOHCixL3yo/QMGDKC+fftSTEwMJSYm0p9//klhYWG13o6SKrKPvduhadKkCe3atYvi4+Np2rRppKqqSs+ePSMionv37pGcnBx99913FBcXR7t37yYjIyOJ/ebbb78lS0tLSk5OLrdeGzZsIEVFRVqzZg2JRCK6ceOGRD1Wr15N58+fp6SkJDp37hxZWFiQh4eHsL4ix3p1x+pj9v+srCwaNmwYOTs7C8fjmzdvaPfu3aSgoPDe/SMyMpIUFBTIw8ODoqKi6J9//qF169YJnf0//viDDhw4QPHx8RQZGUmDBg0iGxsbKiwsJKK3HRpLS0s6duwYiUQi+uqrr8jExITy8/M/Ok7sw7hDw8jBwYGsrKyEX0RERHPmzCErKyu6f/8+ycjI0L///iuxTZ8+fWjevHlEVPSBAkDiV8r69etJT09PeF+yQ/PixQuSk5Oj/fv3C+ufP39OysrKpTo0o0aNEt6LxWLS1dWljRs31lh7i8sdPHiwxDYf6tAQvf2lWFJF4lect4qKisQrPT2d7t69SwDo8uXLwrbp6emkpKRE+/btE8oFQFFRUUIakUhEAOjMmTNlxsDHx4f69esnsezhw4cEgEQiUXmhq3bZ2dkkLy8vtIWI6NmzZ6SkpEReXl4Var+NjQ0tXry41upcERXZx97t0CxYsEB4n5OTQwDoxIkTwratW7eWKGP+/PkS++Tjx4+pS5cuBIDMzc3Jzc2N9u7dK3zREhEZGhrS/PnzK9yO/fv3k5aWlvC+Isd6Zb0vVh+7/xOV/hFFRFRQUEBjxowhAKSvr0+DBw+mdevWUVZWlpBm+PDh1K1btwrXPy0tjQDQrVu3iOhth6bk2dDbt28TAIqNja1wvqzy+CI7AwB06dJF4rqzvb094uPjcevWLRQWFsLc3ByqqqrCKywsDImJiUJ6ZWVltGjRQnhvYGCA1NTUMsu6d+8e8vPzYWdnJyzT0NCAhYVFqbS2trbCv6WkpKCvr19uvpVRXnuLr6N37NixymUAqHD8AODixYuIiooSXo0aNUJsbCxkZWXRuXNnIZ2WlhYsLCwQGxsrLJOXl5eIVVRUFGRkZODg4FBmvaKjoxESEiJRJ0tLSwAoVa+alJiYiLy8PIn2NW7cWNgXKtL+adOmYdmyZejWrRu8vb0RExNTa/V/nw/tY+8q+f+noqICdXV1YV8XiUTo1KmTRPqSxw9QdMxdvXoVt27dgpeXFwoKCuDm5gZnZ2eIxWKkpqbi8ePH6NOnT7l1Pnv2LPr06QMjIyOoqanB1dUVz549w6tXr4Q0lTnWK6q8WN25c+ej9v/yyMjIICgoCI8ePcKKFStgZGSE5cuXo1WrVnjy5AmAomPnfTGKj4/H8OHD0bx5c6irq8PU1BQA8ODBA4l0JetjYGAAANXy2cXKx4OC2Xvl5ORARkYG4eHhkJGRkVhXctCqnJycxDopKSlQNTxVo6x8xWJxlfP9EBUVFYn3xQNsS7YpPz//g/lUNH4A0KxZs4+aJQUASkpKEl8ISkpKH6zXoEGD8NNPP5VaV/zhW1+MHz8eTk5OOH78OE6fPg0/Pz/4+/tj6tSpdV21Sqmufb1169Zo3bo1Jk+ejEmTJqF79+4ICwv7YCc9OTkZAwcOhIeHB3x9fdG4cWNcunQJ7u7uyMvLg7Kycrn1rI5jvSre3f8/xMjICK6urnB1dYWPjw/Mzc0RGBiIJUuWfPDYGTRoEExMTLBlyxYYGhpCLBajdevWpWZJlYxTcd1q47Prc8ZnaBgA4Pr16xLvr127hpYtW6Jdu3YoLCxEamoqzMzMJF76+vofVVbz5s0hJyeHmzdvCsuysrJw9+7dKrWhMspr77udjmLFs1KKf8UBRb/kSpKXly/167uq8bOyskJBQYFEfZ89ewaRSARra+tyt7OxsYFYLEZYWFiZ69u3b4/bt2/D1NS0VL3e7czVpBYtWkBOTk6ifZmZmcK+UNH2GxsbY9KkSTh48CBmzZqFLVu21FobylPZfex9LCws8Pfff0ssK3n8lKc4Ri9fvoSamhpMTU1x7ty5MtOGh4dDLBbD398fXbp0gbm5OR4/flzpun6M8mJlbW39Ufs/UPbxWJZGjRrBwMAAL1++BFB0ZqW8GBWXvWDBAvTp0wdWVlbIzMz8YBmsdnCHhgEoOl06c+ZMiEQi7N69G+vWrYOXlxfMzc0xcuRIjB49GgcPHkRSUhJu3LgBPz8/HD9+/KPKUlNTg5ubG2bPno2QkBDcvn0b7u7ukJaWrtSvrKoor73lMTMzg7GxMRYvXoz4+HgcP34c/v7+EmlMTU2Rk5ODc+fOIT09Ha9evapy/Fq2bAkXFxdMmDABly5dQnR0NEaNGgUjIyO4uLiUu52pqSnc3Nwwbtw4HD58GElJSQgNDcW+ffsAAFOmTEFGRgaGDx+OmzdvIjExEadOncLYsWNrdfqqqqoq3N3dMXv2bJw/fx7//PMPxowZI5wRq0j7p0+fjlOnTiEpKQkREREICQmBlZVVrbWhPJXdx97n22+/RVxcHObMmYO7d+9i3759wn2dio8ZDw8P+Pj44PLly7h//z6uXbuG0aNHQ0dHB/b29gCAxYsXw9/fHwEBAYiPj0dERATWrVsHoGgfz8/Px7p163Dv3j3s3LkTgYGBVQ9EBZQXq4/d/4GiYyAmJgYikQjp6enIz8/Hpk2b4OHhgdOnTyMxMRG3b9/GnDlzcPv2bQwaNAgAMG/ePNy8eROTJ09GTEwM4uLisHHjRqSnp6NRo0bQ0tLC5s2bkZCQgPPnz2PmzJm1ESJWEXU8hod9AhwcHGjy5Mk0adIkUldXp0aNGtEPP/wgDNLLy8ujRYsWkampKcnJyZGBgQENGTKEYmJiiKjswbCHDh2ikrtXRaZt29nZ0dy5c4U07w6cJCJq06aNMB26ptpbVrlERVM5bWxsSFFRkbp370779++XGBRMRDRp0iTS0tKSmLb9ofhVdNq2hoYGKSkpkZOTU5nTVt/1+vVrmjFjBhkYGJC8vDyZmZnR9u3bhfV3796lIUOGCNNhLS0tafr06RKDM2tDdnY2jRo1ipSVlUlPT49WrFhR5rTt8trv6elJLVq0IAUFBdLR0SFXV1dKT0+v1Ta8q7L7GAA6dOiQRB4aGhoUFBQkvH932vbGjRsJAL1+/ZqIimbf9O/fX/j/NjQ0pC+//FLYz4oFBgaShYWFsC9OnTpVWLdq1SoyMDAQ4rxjxw6JfbMix3p1x+pj9//U1FTq27cvqaqqCtO2IyIiaNSoUdSsWTNSUFAgLS0t6tGjBx09elRi29DQUOratSspKCiQpqYmOTk5CTE4c+YMWVlZkYKCAtna2lJoaKjE/1/xoODIyEghv8zMTKEOrOZIEdXxxU/GUHRK3MjICP7+/nB3d6/r6jBWJT179kTbtm1r9PEGvr6+CAwMxMOHD2usjNpQG7FinwceFMzqRGRkJOLi4mBnZ4esrCwsXboUAD54Gpmxz9WGDRvQqVMnaGlp4fLly1i5ciU8PT3rulqMfTK4Q8PqzM8//wyRSAR5eXl06NABFy9ehLa2dl1Xi7FPUnx8PJYtW4aMjAw0bdoUs2bNwrx58+q6Wox9MviSE2OMMcbqPZ7lxBhjjLF6jzs0jDHGGKv3uEPDGGOMsXqPOzSMMcYYq/e4Q8MYY4yxeo87NIyxajFmzBgMHjxYeN+zZ09Mnz691usRGhoKKSkpPH/+vNw0UlJSOHz4cIXzXLx4Mdq2bVuleiUnJ0NKSqrUM8AYY9WDOzSMNWBjxoyBlJQUpKSkIC8vDzMzMyxduhQFBQU1XvbBgwfh4+NTobQV6YQwxtj78I31GGvgnJ2dERQUhDdv3uCvv/7ClClTICcnV+ZN2fLy8iAvL18t5TZu3Lha8mGMsYrgMzSMNXAKCgrQ19eHiYkJPDw84OjoiKNHjwJ4e5nI19cXhoaGsLCwAAA8fPgQw4YNg6amJho3bgwXFxckJycLeRYWFmLmzJnQ1NSElpYWvv/+e7x7j853Lzm9efMGc+bMgbGxMRQUFGBmZoZt27YhOTkZvXr1AgA0atQIUlJSGDNmDABALBbDz88PzZo1g5KSEtq0aYM//vhDopy//voL5ubmUFJSQq9evSTqWVFz5syBubk5lJWV0bx5cyxcuBD5+fml0m3atAnGxsZQVlbGsGHDkJWVJbF+69atsLKygqKiIiwtLbFhw4ZK14Ux9nG4Q8PYZ0ZJSQl5eXnC+3PnzkEkEuHMmTM4duwY8vPz4eTkBDU1NVy8eBGXL1+GqqoqnJ2dhe38/f0RHByM7du349KlS8jIyMChQ4feW+7o0aOxe/duBAQEIDY2Fps2bYKqqiqMjY1x4MABAIBIJMKTJ0+wdu1aAICfnx927NiBwMBA3L59GzNmzMCoUaMQFhYGoKjjNXToUAwaNAhRUVEYP3485s6dW+mYqKmpITg4GHfu3MHatWuxZcsWrF69WiJNQkIC9u3bhz///BMnT55EZGQkJk+eLKz//fffsWjRIvj6+iI2NhbLly/HwoUL8euvv1a6Poyxj1Cnz/pmjNUoNzc3cnFxISIisVhMZ86cIQUFBfruu++E9Xp6evTmzRthm507d5KFhQWJxWJh2Zs3b0hJSYlOnTpFREQGBga0YsUKYX1+fj41adJEKIuIyMHBgby8vIiISCQSEQA6c+ZMmfUMCQkhAJSZmSksy83NJWVlZbpy5YpEWnd3dxo+fDgREc2bN4+sra0l1s+ZM6dUXu8CQIcOHSp3/cqVK6lDhw7Ce29vb5KRkaFHjx4Jy06cOEHS0tL05MkTIiJq0aIF7dq1SyIfHx8fsre3JyKipKQkAkCRkZHllssY+3g8hoaxBu7YsWNQVVVFfn4+xGIxRowYgcWLFwvrbWxsJMbNREdHIyEhAWpqahL55ObmIjExEVlZWXjy5Ak6d+4srJOVlUXHjh1LXXYqFhUVBRkZGTg4OFS43gkJCXj16hX69u0rsTwvLw/t2rUDAMTGxkrUAwDs7e0rXEaxvXv3IiAgAImJicjJyUFBQQHU1dUl0jRt2hRGRkYS5YjFYohEIqipqSExMRHu7u6YMGGCkKagoAAaGhqVrg9jrPK4Q8NYA9erVy9s3LgR8vLyMDQ0hKys5GGvoqIi8T4nJwcdOnTA77//XiovHR2dj6qDkpJSpbfJyckBABw/flyiIwEUjQuqLlevXsXIkSOxZMkSODk5QUNDA3v27IG/v3+l67ply5ZSHSwZGZlqqytjrHzcoWGsgVNRUYGZmVmF07dv3x579+6Frq5uqbMUxQwMDHD9+nX06NEDQNGZiPDwcLRv377M9DY2NhCLxQgLC4Ojo2Op9cVniAoLC4Vl1tbWUFBQwIMHD8o9s2NlZSUMcC527dq1DzeyhCtXrsDExATz588Xlt2/f79UugcPHuDx48cwNDQUypGWloaFhQX09PRgaGiIe/fuYeTIkZUqnzFWPXhQMGNMwsiRI6GtrQ0XFxdcvHgRSUlJCA0NxbRp0/Do0SMAgJeXF3788UccPnwYcXFxmDx58nvvIWNqago3NzeMGzcOhw8fFvLct28fAMDExARSUlI4duwY0tLSkJOTAzU1NXz33XeYMWMGfv31VyQmJiIiIgLr1q0TBtpOmjQJ8fHxmD17NkQiEXbt2oXg4OBKtbdly5Z48OAB9uzZg8TERAQEBJQ5wFlRURFubm6Ijo7GxYsXMW3aNAwbNgz6+voAgCVLlsDPzw8BAQG4e/cubt26haCgIKxatapS9WGMfRzu0DDGJCgrK+PChQto2rQphg4dCisrK7i7uyM3N1c4YzNr1iy4urrCzc0N9vb2UFNTw5AhQ96b78aNG/HVV19h8uTJsLS0xIQJE/Dy5UsAgJGREZYsWYK5c+dCT08Pnp6eAAAfHx8sXLgQfn5+sLKygrOzM44fP45mzZoBKBrXcuDAARw+fBht2rRBYGAgli9fXqn2fvHFF5gxYwY8PT3Rtm1bXLlyBQsXLiyVzszMDEOHDkX//v3Rr18/2NraSkzLHj9+PLZu3YqgoCDY2NjAwcEBwcHBQl0ZYzVLisobxccYY4wxVk/wGRrGGGOM1XvcoWGMMcZYvccdGsYYY4zVe9yhYYwxxli9xx0axhhjjNV73KFhjDHGWL3HHRrGGGOM1XvcoWGMMcZYvccdGsYYY4zVe9yhYYwxxli9xx0axhhjjNV7/wczq7jFb9aw2wAAAABJRU5ErkJggg==",
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "matrix = confusion_matrix(y_true, y_pred)\n",
        "norm_matrix = matrix / matrix.sum(axis=1) * 100\n",
        "\n",
        "plt.imshow(norm_matrix, cmap='Blues')\n",
        "plt.colorbar()\n",
        "plt.xlabel('Predicted label')\n",
        "plt.ylabel('True label')\n",
        "plt.xticks(range(len(labels)), labels)\n",
        "plt.yticks(range(len(labels)), labels)\n",
        "    \n",
        "for i, j in itertools.product(range(matrix.shape[0]), range(matrix.shape[1])):\n",
        "    text = f\"{matrix[i,j]:,}\\n{norm_matrix[i,j]:.2f}%\"\n",
        "    plt.text(j, i, text,\n",
        "            horizontalalignment='center', verticalalignment='center',\n",
        "            color='white' if matrix[i,j] >= matrix[i,:].mean() else 'black')\n",
        "plt.show()"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "gnnbook",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.16"
    },
    "vscode": {
      "interpreter": {
        "hash": "7fa0016a911d70e86532c5706c9b4690ef8aee26a1d06018a1e37e463667ff8c"
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
